我一直认为,在某些情况下,造型可能会成为性能的一个可衡量的障碍。当我们开始处理令人讨厌的异常抛出\捕获的不连贯的网络时,这可能是更多的情况。
考虑到我希望在编程时创建更正确的启发式方法,我被提示向.NET专家提出这个问题:接口强制转换比类强制转换快吗?
为了给出一个代码示例,假设这是存在的:
public interface IEntity { IParent DaddyMommy { get; } }
public interface IParent : IEntity { }
public class Parent : Entity, IParent { }
public class Entity : IEntity
{
public IParent DaddyMommy { get; protected set; }
public IParent AdamEve_Interfaces
{
get
{
IEntity e = this;
while (e.DaddyMommy != null)
e = e.DaddyMommy as IEntity;
return e as IParent;
}
}
public Parent AdamEve_Classes
{
get
{
Entity e = this;
while (e.DaddyMommy != null)
e = e.DaddyMommy as Entity;
return e as Parent;
}
}
}
那么,AdamEve_Interfaces比AdamEve_Classes快吗?如果是这样的话,增加了多少?如果你知道答案,为什么?
发布于 2011-01-03 23:44:31
你就得去测量。
但是,如果强制转换正在成为代码中的(潜在)瓶颈,那么问题菜单上的意大利面条就已经过时了。
发布于 2011-01-04 00:36:09
你试过测试它吗?这是一个运行10,000,000次的循环。在我的机器上,接口版本大约需要440ms,而类版本大约需要410ms。非常接近,但总体而言,类版本获胜。
using System;
namespace ConsoleApplication1
{
public interface IEntity { IParent DaddyMommy { get; } }
public interface IParent : IEntity { }
public class Parent : Entity, IParent { }
public class Entity : IEntity
{
public IParent DaddyMommy { get; protected set; }
public IParent AdamEve_Interfaces
{
get
{
IEntity e = this;
while (this.DaddyMommy != null)
e = e.DaddyMommy as IEntity;
return e as IParent;
}
}
public Parent AdamEve_Classes
{
get
{
Entity e = this;
while (this.DaddyMommy != null)
e = e.DaddyMommy as Entity;
return e as Parent;
}
}
}
class Program
{
static void Main(string[] args)
{
Entity X = new Entity();
Parent P;
IParent IP;
System.Diagnostics.Stopwatch ST = new System.Diagnostics.Stopwatch();
Int32 i;
ST.Start();
for (i = 0; i < 10000000; i++)
{
IP = X.AdamEve_Interfaces;
}
ST.Stop();
System.Diagnostics.Trace.WriteLine(ST.ElapsedMilliseconds);
ST.Reset();
ST.Start();
for (i = 0; i < 10000000; i++)
{
P = X.AdamEve_Classes;
}
ST.Stop();
System.Diagnostics.Trace.WriteLine(ST.ElapsedMilliseconds);
}
}
}
https://stackoverflow.com/questions/4585810
复制相似问题