查看代码运行速度的方法是性能分析.有它的工具等,但我想知道代码速度的因素是什么.
例如,我被告知图像编辑软件将使用按位运算而不是整数变量来计算它们的东西,因为它更快.
因此,与binairy相比,这必须意味着使用整数和其他原始类型需要更多的步骤来计算.
必须有其他的东西,但我没有足够的经验,如何操作系统连接到您的硬件和许多编码语言的内部工作,以了解什么.
所以我在这里问:你知道是什么影响了代码的速度吗?
没有程序一定的速度.
整数是二进制的.或者更确切地说,整数只是整数,可以用任意数字表示.在基数10中,您将写入13,在基数16中,您将写入d(或0xd),以二进制形式写入1101(或0b1101).罗马人会写XIII.它们都代表了数字'十三' 的相同概念.在人类中,我们倾向于使用基数10表示,但是当您要求计算机处理整数时,它使用二进制表示.它并没有什么不同.无论我怎么写,十三加四十五都会得到相同的结果.XIII + 0x2D = 13 + 45 = 0xd + 0b101101.使用哪种表示无关紧要,算术运算的结果是相同的.
一些编程语言也为您提供了"十进制"数据类型,但这通常与浮点算术相关,其中并非所有值都可以在所有基础中表示(1/3可以在基数3中轻松表示,但不能在2或10中表示)例如,1/10可以用10表示,但不能表示2)
然而,将任何特定操作单独列为"慢"是非常困难的,因为它取决于它.现代CPU采用了大量技巧和优化来大多数时间加速大多数操作.实际上,要获得高效代码需要做的就是避免所有特殊情况.并且有很多这些,并且它们通常更多地与指令的组合(和顺序)有关,而不是使用指令.
为了让您了解我们所讨论的细微差别,浮点运算可以在理想情况下以尽可能快(或有时快于)整数算术的方式执行,但延迟时间更长,这意味着理想的性能更难以实现实现.否则几乎免费的分支会变得很痛苦,因为它们会抑制指令重新排序和调度,在编译器中以及在CPU上动态执行,这使得隐藏此延迟变得更加困难.延迟定义从指令启动到结果准备所需的时间; 大多数指令只占用CPU一个时钟周期即使结果尚未准备好以下周期,CPU也能够启动另一条指令.这意味着如果不立即需要结果,高延迟指令几乎是免费的.
无论你做什么,某些指令都很慢,并且通常会停止CPU的相关部分,直到指令完成为止(平方根是一个常见的例子,但整数除法可能是另一个.在某些CPU上,双倍一般会受到影响相同的问题) - 另一方面,虽然浮点平方根将阻止FP管道,但它不会阻止您同时执行整数指令.
有时,将值存储在可根据需要重新计算的变量中会更快,因为它们可以放在寄存器中,从而节省几个周期.其他时候,它会因为你的寄存器用完而变慢,并且必须将值推送到缓存,甚至推送到RAM,这使得每次使用都需要重新计算.您遍历内存的顺序会产生巨大的差异.随机(分散)访问可能需要数百个周期才能完成,但顺序访问几乎是即时的.执行你的读取正确的模式/写允许CPU保持在缓存中所需的数据几乎所有的时间,和通常"正确的模式"意味着按顺序读取数据,并且一次处理大约64kb的块.但有时候不是.在x86 CPU上,一些指令占用1个字节,其他指令取17个.如果你的代码包含很多前者,指令获取和解码不会成为瓶颈,但如果它充满了更长的指令,那么可能就是限制每个周期CPU可以加载多少指令,然后它能够执行的数量无关紧要.
在现代CPU中,很少有通用的性能规则.
我觉得你错了.整数是二进制数.图像编辑软件将尽其所能避免浮点计算,因为与整数或位移操作相比,它们速度极慢.
但通常情况下,首先要通过选择正确的算法进行优化,而不是通过担心是后增量还是预增量等小问题进行优化.
例如:我只花了最后两天加快了我们重新计算一组特定值的方式.我从循环中抽出一些东西并预先计算它,所以它只进行了M次而不是M次N次,并且在变量中存储了一个值,而不是每次从其他地方查找它,因为使用了该值在比较器中,所以在Collections.sort阶段会调用它.我的总执行时间从大约45秒到20秒.然后我的一位同事在这里待了很长时间,指出我不需要重新计算这些值,我可以将它们从不同的物体中拉出来.突然间它会在2秒内执行.现在这是我可以相信的优化.