Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在移植应用程序时有效利用64位体系结构_C#_.net_Performance_64 Bit - Fatal编程技术网

C# 在移植应用程序时有效利用64位体系结构

C# 在移植应用程序时有效利用64位体系结构,c#,.net,performance,64-bit,C#,.net,Performance,64 Bit,我正在考虑将处理器密集型32位.NET4(C#)控制台应用程序移植到64位。这是一种并行数字运算算法,运行时间约为5小时 我对性能优势略知一二,但不确定如何更改代码以充分利用64位体系结构。例如,我应该考虑将所有的It32类型更改为It64等吗?< /P> 在哪里可以找到一些全面的资源来了解移植到x64时的优化注意事项?搜索得到的大多是关于x64体系结构的一般信息。对于纯.NET代码,您似乎无法优化自己。 编译到任何cpu,IL编译器将优化到x64,以获得额外的内存空间和更多的寄存器 有关类似的

我正在考虑将处理器密集型32位.NET4(C#)控制台应用程序移植到64位。这是一种并行数字运算算法,运行时间约为5小时

我对性能优势略知一二,但不确定如何更改代码以充分利用64位体系结构。例如,我应该考虑将所有的It32类型更改为It64等吗?< /P>
在哪里可以找到一些全面的资源来了解移植到x64时的优化注意事项?搜索得到的大多是关于x64体系结构的一般信息。

对于纯.NET代码,您似乎无法优化自己。 编译到任何cpu,IL编译器将优化到x64,以获得额外的内存空间和更多的寄存器


有关类似的讨论,请参见

将32位类型更改为64位类型本身没有帮助。32位操作与x64上的64位操作一样快或更快。不同的是64位操作比32位模式更快。例如,如果您使用一个int32数组,也可以使用长度为一半的int64数组,这可能会有所帮助

您没有提到您的应用程序是否也是内存密集型的。然而,
请注意,在进行此转换时,您的应用程序内存占用预计将显著增加。因为所有的引用类型指针现在占用了两倍的空间。换言之,尽管您的地址空间实际上是无限的,但有效的内存利用率仍然受到RAM的限制。

您的努力不会有什么回报。x64内核与x86内核同步,时钟速度相同,并且受硅的物理特性限制。x64内核的一个明显优势是,它可以同时处理64位,是x86内核的两倍。但实际上,很少有现实世界中的问题真正需要这个范围。大多数整数问题在+/-20亿范围内都能很好地工作。从代码中很容易看出,如果在最内部的循环中有很多long而不是int变量,那么您将领先

x64内核的一个显著缺点是它消耗可用缓存的速度要快得多。这也受到硅的限制,芯片上只能容纳这么多的内存。任何指针的大小都是原来的两倍,在32位模式下是8字节,而不是4字节。指针用于任何对象引用。缓存在现代内核上是一个非常重要的问题,内存总线的速度比内核的速度慢得多。x64多了8个cpu寄存器(r8到r15),这一缺点在某种程度上得到了平衡


最终的效果是32位代码的执行速度通常比64位代码快一点。只有当您的程序陷入困境时,您才能从64位代码中获益,因为它必须将处理的数据塞进2G字节的地址空间。换句话说,必须使用文件或内存映射文件以避免内存不足。如果您的应用程序受到计算限制,正如您在问题中所建议的那样,您不太可能领先。

x64并不能神奇地让您的程序更快。你会得到新的指令(比如64位算术),如果这些指令适合你所做的,你可以得到一个很大的加速,如果它们不适合,你什么也得不到。你确定这个过程还没有像64位那样运行吗?当任务管理器在64位机器上运行时,请查看它。如果进程名后面没有*32,它将以64位运行。如何编译应用程序?在项目设置下更改为
AnyCPU
,它将自动运行为64位上的64位OSesI最初使用x86编译,最近切换到x64。不,该应用程序实际上根本不占用内存。谢谢。有道理,尽管令人失望。看起来我必须探索其他替代方案,例如卸载到GPU、创建BigInteger的自定义实现等,以获得我所希望的显著性能提升。使用非托管代码的自定义实现
BigInteger
可以极大地提高性能。例如,我不知道如何利用使用C#的64位乘法指令。