我正在做MCTS Exames70-536Microsft .Net框架应用程序开发基础的练习题,其中一个问题是创建两个类,一个泛型,一个对象类型,这两个类都执行相同的事情;其中一个循环使用该类并迭代数千次。并使用计时器,对两者的性能进行计时。在C# generics question上还有另一个帖子也在寻找同样的问题,但没有人回复。
基本上,如果在我的代码中,我首先运行泛型类,它需要loger来处理。如果我先运行object类,那么处理object类所需的时间会更长。整个想法是为了证明泛型执行得更快。
我使用原始的用户代码来节省一些时间。我没有特别看到代码中有任何错误,并且对结果感到困惑。有人能解释一下为什么会出现这种不寻常的结果吗?
谢谢,
Risho
代码如下:
class Program
{
class Object_Sample
{
public Object_Sample()
{
Console.WriteLine("Object_Sample Class");
}
public long getTicks()
{
return DateTime.Now.Ticks;
}
public void display(Object a)
{
Console.WriteLine("{0}", a);
}
}
class Generics_Samle<T>
{
public Generics_Samle()
{
Console.WriteLine("Generics_Sample Class");
}
public long getTicks()
{
return DateTime.Now.Ticks;
}
public void display(T a)
{
Console.WriteLine("{0}", a);
}
}
static void Main(string[] args)
{
long ticks_initial, ticks_final, diff_generics, diff_object;
Object_Sample OS = new Object_Sample();
Generics_Samle<int> GS = new Generics_Samle<int>();
//Generic Sample
ticks_initial = 0;
ticks_final = 0;
ticks_initial = GS.getTicks();
for (int i = 0; i < 50000; i++)
{
GS.display(i);
}
ticks_final = GS.getTicks();
diff_generics = ticks_final - ticks_initial;
//Object Sample
ticks_initial = 0;
ticks_final = 0;
ticks_initial = OS.getTicks();
for (int j = 0; j < 50000; j++)
{
OS.display(j);
}
ticks_final = OS.getTicks();
diff_object = ticks_final - ticks_initial;
Console.WriteLine("\nPerformance of Generics {0}", diff_generics);
Console.WriteLine("Performance of Object {0}", diff_object);
Console.ReadKey();
}
}发布于 2011-01-03 22:39:31
您的测试不正确。以下是您的方法:
public void display(T a)
{
Console.WriteLine("{0}", a); // Console.WriteLine(string format, params object[] args) <- boxing is performed here
}
public void display(Object a)// <- boxing is performed here
{
Console.WriteLine("{0}", a);
}因此,在这两种情况下,您都使用了boxing。比方说,如果你的类可以计算所有值的总和,那就更好了:
public void add(long a)
{
Total += a;
}
public void display(Object a)// <- boxing is performed here
{
Total += (long) a;// <- unboxing is performed here
}发布于 2011-01-03 22:36:25
我能看到的第一个问题是,您正在使用DateTime对象来测量应用程序中的时间(时间间隔非常小)。
您应该使用Stopwatch类。在尝试对代码进行基准测试时,它可以提供更高的精确度。
第二个问题是您没有考虑到JIT (即时编译)。第一次调用你的代码会花费更长的时间,因为它必须是JIT的,然后你就会得到你的结果。
在开始计时之前,我会对你的代码进行一次调用,这样你就可以准确地了解循环期间发生了什么。
发布于 2011-01-03 22:34:58
您应该先分别运行这两个类,然后再对其进行计时以允许JITter运行。
https://stackoverflow.com/questions/4585280
复制相似问题