Delphi 64位?

24

Delphi 64位正在路上,这是众所周知的(至少是每个Delphi程序员都知道的)。除了CodeGear关于64位Delphi应用程序的好处(而CodeGear并没有多说什么)外,我从拥有64位Delphi应用程序中会得到什么好处?当CodeGear发布它时,将我的应用程序移植到64位真的是个好主意吗?

编辑:

我只是想要所有可能的意见。目前为止,我可以说,我确实需要更多可用于我的应用程序的内存,因为它消耗了大量资源。如果可能的话,我确实可以使用更多速度。我不需要shell扩展或插件。

我的客户也在问我是否有一个x64版本的应用程序,但我真的不明白他们为什么要问,因为他们实际上是律师,不知道什么是64位应用程序。

编辑

我实际上并不直接参与应用程序开发。我是技术团队的一部分,我创建的东西被我所在公司的其他开发人员用于真正开发最终的应用程序。因此,我的工作是做技术性的事情,将应用程序移植到x64就是我做的那种事情,但我需要向我的上级解释为什么这样做。


“因为它消耗了很多资源”并不意味着你需要64位。这可能意味着你需要更好地管理资源。拥有更多的内存并不意味着你不应该使用良好的资源使用实践;如果没有其他选择,你应该使用额外的内存,正如我的帖子所提到的。我有一些应用程序每天处理数十万个医疗索赔交易,对于它们来说,除了可能会减慢速度之外,64位不会给它们带来任何好处。64位并不自动意味着更快;事实上,它通常意味着更慢,除了某些依赖于大内存分配的操作。 - Ken White
一个编辑把我的评论放在了你的回复下面,供其他人参考。我并不是试图侮辱你的代码(或者暗示我了解你的应用程序)。我只是指出,如果没有强烈需求,你的应用程序将不会从64位中受益(正如我的编辑试图用我的自己的应用程序举例所述)。没有任何冒犯或批评的意思,Rafael - 如果听起来是这样的话,我很乐意删除评论。 - Ken White
对不起,我误解了你的帖子。我会删除它。谢谢你的帮助,再次道歉。 - Rafael Colucci
关于x64版本,对于那些不了解计算机的人来说,你可以轻松地说你的Delphi应用程序适应了Windows的x64版本,并且已经是一个64位应用程序。我相当确定在代码中有一些Int64变量,所以对于那些不知道CPU寄存器是什么的人来说,你已经在你的Delphi应用程序中进行了64位计算。这个回答有点“耶稣式”,但对于一个错误的问题,没有正确的答案。你是这里的技术人员:你拥有知识。律师们整天都在做这个。所以去做吧。 - Arnaud Bouchez
3
如果你有启动画面,就在上面添加“64位认证”、“支持64位系统”或其他带有64位的无意义声明。这样律师就不会再抱怨了。 ;) - The_Fox
7个回答

30

64位程序相较于32位(x86)编译的同一程序具有以下优势:

  • 更多寄存器。 64位x86芯片拥有更多的寄存器,理论上(如果编译器充分利用)在某些情况下可以导致更快的代码。

  • 更多内存。 使用32位程序,通常限制为2GB地址空间或总共4GB地址空间,如果使用/LARGEADDRESSAWARE编译,则实际上只有约3.5GB,因为Windows的内核/用户空间分割。 64位进程可以寻址更多内存。 只有当您的应用程序需要大量内存时,这才很重要。

  • 能够为64位程序构建插件,例如资源管理器。 除非您正在使用COM作为插件,其中数据是编组的,否则您无法在Windows中的一个进程中混合32位和64位代码,例如64位EXE加载32位DLL。 如果您想编写资源管理器插件,例如,您不能使用旧版本的Delphi使其与64位版本的资源管理器一起工作。 您将能够使用64位版本。

  • 特定于Delphi:编译器将使用SSE / SSE2指令进行浮点计算,而当前的32位编译器仅使用x87 FPU指令(我想是这样的)。 这应该会为浮点数学提供速度提升。 除非您的应用程序高度依赖FP(例如游戏或数据处理应用程序等),否则您可能甚至不会注意到。

你的问题“64位Delphi应用程序是否有益?”的答案高度取决于你的具体应用程序。通常情况下,除了可能会略微提高速度外,不太可能有太多好处。但是不要指望64位可以加速缓慢的应用程序:对于大幅提高速度,仍需要进行算法更改。64位并不是灵丹妙药。除此之外,只有在你已经遇到32位限制中的一种时才需要更改-我怀疑你还没有,否则你就不会问这个问题了。

如果你决定转换,你可能会发现这个线程非常有用。

但是还有一件事:即使你不需要更改,你也可能想要更改,特别是如果你的应用程序是个人项目。你可能会学到东西,当你解决32/64位问题时,你的代码质量会更高,而且这样的项目也很有趣。毕竟,你是一个程序员 :)

编辑:我看到你更新了你的问题,写道“我可以说我真的需要更多可用于我的应用程序的内存,因为它消耗了很多资源。如果可能的话,我确实需要更快的速度。”

  • 需要什么资源?内存?64位只会给你更大的可寻址地址空间,除此之外没有其他资源。如果GDI句柄等被视为资源,那么它不会给你更多。但是,如果您确实需要更多内存,则转换为64位将是值得的。

  • 如果要实现“更快”,则通过算法或线程更改比通过64位编译器更容易实现。

  • “我的客户也问我是否有x64版本的应用程序,但我真的不明白他们为什么要问,因为他们实际上是律师,不知道什么是64位应用程序。” 他们很可能听说过64位更好或更快。在理想的情况下,客户应该具有基于现实的要求,但并非总是如此。从实用的角度来看,如果客户需要这样的东西,将其转换可能是值得的,因为这会让他们感到满意:满意的客户是好的,他们可能会为新版本付费,并且它可能有助于公司的口碑声誉。


6
非常感谢您的优秀且详细的帖子,我给您点赞。 - Rafael Colucci
据我所知,句柄是指针/句柄,指向映射到内核内存空间中的内存。在32位Windows中,内核内存空间为1或2 GB。在64位Windows中,据我所知,内核内存空间是可寻址范围的一半。我认为64位中也有可用的句柄 :-) - Marco van de Voort
1
嗨,Marco!恐怕我不确定你在说什么。句柄是不透明的,不应该被视为指针(尽管它们可能是。它们也可能是索引、哈希、指向指针的指针,谁知道)。或者,你是说 HANDLE / THandle 类型现在更宽了吗?我提到的是 GDI 句柄限制 - 据我所知,无论是地址空间还是其他,这在 Windows 的 64 位版本中仍然适用。我认为许多其他系统资源限制也是相同的。 - David
对我来说,64位Windows的主要用途是原生64位应用程序可以使用Delphi编写Shell扩展,可与64位Windows资源管理器一起使用,并且64位DLL和COM对象可以在本机Win64世界中运行,而不是在Win32(WOW)气泡中,这实际上是一个虚拟的Win32环境。随着时间的推移,仅具有Win32应用程序所遭受的劣势清单将变得越来越大,因为Win64世界最终可能会比32位应用程序更常见和日常化。Delphi必须提供64位和32位,否则最终将会消亡。 - Warren P
1
David M:更确切地说,已知与句柄相关联的内存分配的最大空间,在64位系统中显著增加。默认情况下,Windows NT变体将一半的地址空间用作内核内存,其中大部分用于动态句柄分配。作为例外,在XP及以后的版本中,32位x86可以在1GB和2GB内核空间之间切换(1GB内核空间可增加应用程序内存空间)。 - Marco van de Voort
David M:有一个小的额外优势,即地址空间通常比系统中实际内存要大得多。人们可以轻松地在其中映射内存,例如50GB BD镜像的差异。 - Marco van de Voort

14

您的应用程序是否需要实际访问大于4GB的内存,例如视频或图像处理,或快速处理大量数据?您的应用程序是否是需要在64位Windows上运行的Shell扩展?您是否有客户或客户端抱怨因为没有提供64位版本的应用程序而感到困扰?

如果您需要立即更新应用程序为64位版本,您已经知道了。由于您并不需要,因此您可能有很多时间来完成 - 请记住,大多数应用程序的32位版本在64位Windows版本上运行良好。


在我看来,如果“客户或顾客在抱怨”,而之前的条件都不适用,那么这些客户并不知道他们在说什么,并且通过纠缠你受到自己的伤害。 - Chris Thornton
@Chris:完全同意。然而,有时候客户的需求(无论是否合理)会影响事情的发展,这取决于你所处的市场。 - Ken White

10

如果您编写shell扩展,那么您已经知道为什么需要64位。在我的情况下,我有一个DLL由Windows资源管理器加载,它绝不能加载32位DLL。虽然有一些应用程序可以从64位中受益,但大多数应用程序从我个人看来并不需要64位。对于像我这样的应用程序,64位更多的是一种麻烦而非其他。

好主意吗?只有当您认为它会让您赚更多钱时才是。否则,最好花时间改善质量或添加功能。除非您使用纯本机VCL控件和库,否则您可能需要等待第三方支持跟上步伐。我仍在修复和替换库,与转换为Unicode相关。


5

大多数程序不会受影响。

我只有一个程序需要写64位版本,那是为了增加缓存大小,即使这样做也只是因为我认为最好的权衡方案会将最大内存使用略微超过2GB。


@Loren,如果你想要超过2GB但少于3.5GB的内存,可以尝试使用LARGEADDRESSAWARE PE标志进行构建。在Delphi中,你可以通过{$SetPeFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}来实现,在C++Builder中则可以在项目选项中设置图像标志。 - David
@david,你说的3.5是什么意思?你应该得到完整的4。 - David Heffernan
@David Heffernan:在32位Windows上,你无法分配4GB的内存,因为其中一部分仍然被内核保留。在64位Windows上运行,您可以访问完整的4GB地址空间。 - David
我的观点(可能没有解释清楚)是Loren想要超过2GB的内存,他可以在32位Windows上获得超过2GB的内存,这并不需要64位(Windows或Delphi)。也就是说,他可能已经能够实现他想要的,而无需等待64位编译器。 - David
@david m 在32位的Windows系统上,它将是2GB。操作系统在32位Windows中为自身保留了2GB的地址空间。 - David Heffernan

5

64位将会在许多核心的机器上对于数据并行、多线程数值应用程序有影响。对于这样的应用程序,如果数据无法分成足够小的块,则32位地址空间可能会受到限制。

除此之外,推动64位的最大原因是为其他程序提供扩展。例如,Shell扩展、Excel插件、MATLAB扩展等。


2
@Cosmin 今天起,我正在处理一个客户的四核心、四线程每个核心的四核心机器,共64个核心。恰好我的应用程序可以使用足够大的有限元模型来引起问题。目前的解决方案是使用单独的进程,但这对用户来说很不方便。64位Delphi将使这个问题消失。 - David Heffernan
2
我想知道那到底是真正的多核心。本质上你说“有时候你需要更多的内存”。无论是由一堆核心乘以中等大小的内存,还是由一个核心处理的大内存,这些陈述只会混淆整个情况。 - Marco van de Voort
1
@Marco 你会如何共享数据?数据并行意味着每个核心都在处理不同的数据。我觉得每个质疑我的说法的人都缺乏对这种问题的认识,这是可以理解的,因为我怀疑很少有 SO Delphi 专家在这个领域有太多经验。 - David Heffernan
1
@Marco,你对我所谈论的应用程序一无所知。你怎么能做出这样的判断呢?这些限制不是人为的,而是自然的。 - David Heffernan
1
@Marco 嗯,你可能是对的,但是世界各地选择使用它来设计海上结构的工程师们并不同意。 - David Heffernan
显示剩余8条评论

3
不,保持您的应用程序为32位。
“我的客户也在问我是否有x64版本的应用程序,但我真的不明白他们为什么会这样问。”
您的用户希望您的应用程序能够在64位Windows上完美运行。您应该测试一下,并告诉他们您已经测试过它,并且在64位Windows上可以正确运行。

虽然我不同意创建一个64位版本的你的软件是不必要的,但我给你点赞,因为你完全正确地说“用户想要的是你的应用程序在64位Windows上完美地工作”。 - lkessler

3
我有一些客户会出现这个问题。这主要是因为他们所在公司的IT部门在购买新软件(或批准更新等)时需要考虑一些事项清单。这些清单不时会进行更新以更好地反映现代IT技术环境,但并不总是意味着新元素在你自己的应用软件上下文中是合理的。
有些人开始说“由于我们有64位的Windows XP / Vista / 7等,我们需要确保任何新软件也是64位的”。作为开发人员,我们知道这并不一定是正确的,但是如果你试图向非技术人员解释这一点,通常会被看作你试图掩盖你的应用程序实际上并不是64位。当你是一个与其他供应商竞争激烈的小型定制供应商时,你不能因某些无关紧要的“功能”而让你的工作失去机会。
到目前为止,我的做法是告诉客户,该软件已经在64位Windows上经过了彻底的测试和验证,但是已经开发出相同版本,可以在32位或64位Windows上运行。这是完全正确的,因为我的应用程序主要基于Delphi 2007,并且在过去一年左右的时间里,我已经开始将所有测试都放在64位Win7上作为首选(然后在关键里程碑处再次在32位XP下执行一部分测试)。
另外,无论是在小型企业环境还是家庭环境中(更令人惊讶的是),我看到的64位Win7安装数量远多于32位。我在过去6个月中看到的大多数新机器似乎都带有64位Win7,这很有趣。
我也喜欢The_Fox对原问题的评论-我可能需要相应地更新我的闪屏画面,尤其是如果我可以检测到程序正在64位的Windows上运行...

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