64位平台上的Int32和Int64性能有何区别?

13

我的问题比较简单。在32位平台上,由于CPU一次处理32位,因此最好使用Int32而不是short或long。那么在64位架构上,是否使用long会更快?我创建了一个快速且不太规范的应用程序来测试基准。以下是代码(我已经警告它很不规范):

static void Main(string[] args)
    {
        var lar = new long[256];

        for(int z = 1; z<=256;z++)
        {
            lar[z-1] = z;
        }
        var watch = DateTime.Now;
        for (int z = 0; z < 100000000; z++)
        {
            var lard = new long[256];
            lar.CopyTo(lard, 0);

        }
        var res2 = watch - DateTime.Now;

        var iar = new int[256];

        for (int z = 1; z <= 256; z++)
        {
            iar[z - 1] = z;
        }

        watch = DateTime.Now;

        for (int z = 0; z < 100000000; z++)
        {
            var iard = new int[256];
            iar.CopyTo(iar, 0);

        }

        var res1 = watch - DateTime.Now;
        Console.WriteLine(res1);
        Console.WriteLine(res2);


    }

它产生的结果比int类型快大约3倍,这使我好奇是否应该开始使用long类型作为计数器等。我还进行了类似的计数器测试,发现long类型速度略微更快。有人对此有任何建议吗?我也理解,即使long类型更快,它们仍将占用两倍的空间。


2
首先,在这种性能测试中,使用StopWatch而不是DateTime.Now(更准确)。其次,在int迭代中,您正在将iar复制到自身。不确定是否会影响任何内容,但以防万一。 - Flatliner DOA
2个回答

3

不行。在32位CPU上进行64位操作需要更长的时间,因为CPU一次只能处理32位。而64位CPU会忽略缺失的32位。

另外,在没有明显瓶颈时,尽量避免过度优化。


我认为你误解了我的陈述。我同意在32位系统上使用64位大小的类型需要更长时间。我的问题是,在64位CPU上,我是否应该使用long而不是int,因为long是64位而int是32位。 - Omego2K
1
一个64位的CPU会忽略掉缺失的32位,速度上没有任何区别。不过,如果你想在CPU级别进行优化,请不要使用编译成字节码的语言,而是使用汇编语言或C语言。 - beatgammit
Java编译成字节码,.NET编译成中间语言(IL)。我只是好奇而已。如果这是真的,那么为什么在32位系统上使用short会更慢呢?short是两个字节,在32位CPU上得到填充为32位。据我所知,如果使用小于CPU架构的类型,它将被填充为相等的类型。这意味着如果您在32位CPU上使用short(2个字节),则在处理它时会将short填充为32位。然后,在需要读取它时,只读取前16位。另外,为什么在我的复制示例中使用long比使用int快3倍? - Omego2K
这是我上面评论的延续。我只是好奇而已。另外,我不懂汇编语言,也不喜欢C或者C++,因为解释性语言更简单。 - Omego2K

3

这引发了几个问题。1)为什么我的测试应用程序显示long类型比int类型快大约3倍。2)像C++这样的语言如何处理这个问题,因为它的int类型是64位的。他们会使用short类型代替int类型吗? - Omego2K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接