首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >泛型与对象性能

泛型与对象性能
EN

Stack Overflow用户
提问于 2011-01-03 22:32:00
回答 5查看 1.8K关注 0票数 5

我正在做MCTS Exames70-536Microsft .Net框架应用程序开发基础的练习题,其中一个问题是创建两个类,一个泛型,一个对象类型,这两个类都执行相同的事情;其中一个循环使用该类并迭代数千次。并使用计时器,对两者的性能进行计时。在C# generics question上还有另一个帖子也在寻找同样的问题,但没有人回复。

基本上,如果在我的代码中,我首先运行泛型类,它需要loger来处理。如果我先运行object类,那么处理object类所需的时间会更长。整个想法是为了证明泛型执行得更快。

我使用原始的用户代码来节省一些时间。我没有特别看到代码中有任何错误,并且对结果感到困惑。有人能解释一下为什么会出现这种不寻常的结果吗?

谢谢,

Risho

代码如下:

代码语言:javascript
复制
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();
    }
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-01-03 22:39:31

您的测试不正确。以下是您的方法:

代码语言:javascript
复制
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。比方说,如果你的类可以计算所有值的总和,那就更好了:

代码语言:javascript
复制
public void add(long a)
{
    Total += a;
}

public void display(Object a)// <- boxing is performed here
{
    Total += (long) a;// <- unboxing is performed here
}
票数 5
EN

Stack Overflow用户

发布于 2011-01-03 22:36:25

我能看到的第一个问题是,您正在使用DateTime对象来测量应用程序中的时间(时间间隔非常小)。

您应该使用Stopwatch类。在尝试对代码进行基准测试时,它可以提供更高的精确度。

第二个问题是您没有考虑到JIT (即时编译)。第一次调用你的代码会花费更长的时间,因为它必须是JIT的,然后你就会得到你的结果。

在开始计时之前,我会对你的代码进行一次调用,这样你就可以准确地了解循环期间发生了什么。

票数 9
EN

Stack Overflow用户

发布于 2011-01-03 22:34:58

您应该先分别运行这两个类,然后再对其进行计时以允许JITter运行。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4585280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档