警告:这个问题比您可能意识到的要复杂得多,而且肯定比大多数答案所描述的要多。为了至少涵盖更多故事,这篇文章相当长...
首先,视频存储的情况。视频卡的整个内存在CPU的地址空间中不(至少正常情况下)不直接可见。通常,CPU可以看到大约128-256 MB的视频内存的“窗口”。GPU可以将其内存的不同部分映射到该窗口,因此通常可以从CPU写入大多数GPU内存,但是您需要提前告知GPU要写入的内容。举例来说,当您使用DirectX并想直接写入图形内存时,可以做到这一点-但要做到这一点,首先要调用LockRect
让GPU将正确的内存映射到窗口中(并且完成后,您立即致电UnlockRect
因此它可以根据需要映射其他内存)。至少在典型情况下,您可以在BIOS设置中调整视频窗口的大小。
其次,即使在32位模式下,x86处理器也支持所谓的物理地址扩展(PAE),它使CPU可以寻址4 Gig以上的地址。的记忆。Microsoft确实在某些Windows版本中支持PAE,但仅支持相对昂贵的Windows Server企业版。此外,必须使用AWE专门编写该程序。只有少数程序(例如,SQL Server企业版)曾经这样做过。底线:有可能,但相当罕见。
就一次读取64位而言:最后一次一次只能读取32位数据的处理器是486。从奔腾开始,所有处理器都具有64位数据总线。请注意,地址总线与数据总线不同,因此扩展到64位数据总线并不能使处理器使用更多的内存(尽管碰巧,Pentium Pro中添加了PAE,所以它是几乎与扩展到64位数据总线)并发的。
即使奔腾可以在一个时钟周期内读取64位数据,但在内部它(主要)一次只能处理32位数据。较宽的总线主要有助于弥补CPU和主内存之间的速度差异。奔腾MMX的MMX指令支持以64位块的形式处理数据,但是使用起来很笨拙,而且(尤其是)大多数编译器没有生成MMX代码,因此您几乎必须用汇编语言编写才能使用它。奔腾还支持浮点数的64位(和80位)操作,但这仅用于大多数编程中的一小部分(通常比使用整数慢得多)。
x86-64设计的通用寄存器确实是32位x86设计的两倍,并且每个寄存器的宽度都是64位。但是,当CPU在32位模式下运行时,只有32位CPU上存在的寄存器的子集可用。
回到浮点状态,在32位模式下,浮点数学运算使用最初为Intel 8087数学协处理器设计的指令集完成。这样使用的模型很难充分利用其功能。英特尔(和AMD)最近添加了“流式SIMD扩展”或SSE。大多数64位编译器生成的代码可以/确实可以使用SSE而不是8087兼容的浮点。SSE中的“ SIMD”代表“单个指令,多个数据”。这意味着一条 SSE指令可以对两个单独的数据执行两个浮点运算。尽管这不一定使速度提高一倍,但通常至少会提高一点速度。
最后,我可能应该指出,比较的一部分通常有点不公平。当您安装新的操作系统时,它几乎总是比已经使用了一段时间的操作系统至少快一点。程序将数据存储在注册表,硬盘等中。添加的数据越多,在任何给定时间查找所需的数据往往涉及更多的工作。虽然销售“注册表清洁器”之类的公司经常夸大这种影响,但在某种程度上还是如此。因此,如果您要做的只是重新格式化硬盘驱动器并重新安装完全相同的操作系统,那么您可能会期望看到一些速度上的改进-如果您已经安装了旧的操作系统并长时间使用它, ,这种改进(全部)可以非常充实。您看到的至少部分速度提升可能与两个操作系统之间的实际差异无关。
当然,还有更多,但您开始明白了。与单个功能产生巨大差异无关紧要,因为许多功能通常通常会产生很小的差异,但是其中许多功能相加(甚至相乘)在一起就可以带来相当大的差异。