最近,当使用x64目标与x86相比时,我对F#编译器的行为感到惊讶。相同的应用程序在不同的目标上使用以下时间:
x86: 68ms
Any CPU/x64: 160ms
对我来说这个结果很奇怪。 结果相差几乎两倍。我假设在64位处理器,64位操作系统上,64位应用程序的工作速度比32位应用程序快。
所以问题是:出了什么问题?问题出现在编译器中,或者是我的错?
环境:Core 2 Duo和Windows 7 x64。 F#应用程序:FsYacc / FsLex语言解析器。 .Net 4框架。
答案 0 :(得分:2)
对于使用大量指针数据结构的程序,可能会发生这种情况,因为指针在64位上是8字节,而在32位上是4字节。指针追踪代码的瓶颈是缓存未命中。在100%的代码追逐指针的限制中,64位和32位的缓存未命中率是两倍,因此速度减慢了2倍。
但是对于其他类型的程序,64位可能比32位快,至少在x86 / x64上。 x64的通用寄存器数量是32位x86的两倍,SSE / SSE2等新指令保证在x64上可用,但不能在32位x86上使用,并且有更多的地址空间可以进行不同的空速权衡,例如作为存储,而不是重新计算值或内存映射大文件。
答案 1 :(得分:0)
您是否尝试在应用中使用Int64而不是Int32?您是否尝试过更改为8位字符集?这些事情如何影响性能?
您是否运行普通硬盘或SSD?