一个密码库有一个瓶颈 无法检测:加密半兆字节需要50秒。
每经考取.
他们已经走了好几个月了 原因是一个不断重复的陷阱:一个正确,有据可查的优化,它修正了常数而不是命令——而其评论正是因为它写得很好,让读者相信问题已经解决了.
代码是怎样做的 Quipu 使加密的数据成为符号序列.
要做到这一点,它把整个消息转换成一个巨大的整数, 并反复将其分割为取出数字, 就像你用手将一个10基数转换为2基一样。
代码没有一次分割一个位数.
它携带了一个明智的优化:由一个机器单词中匹配的基数的最大功率所分出,每通取出九个位数而不是一个.
解释它的评论开头说,一次做一次将是四分法,然后描述了改进。
所有真实。
结果仍然是四分法: 取出每通取出9位数字 将工作除以9; 它不会改变工作的发展。
这句子——"用这种方式来做将是四重奏"——用过去紧张的语气来读取,仿佛描述了以前的状态.
它描述了目前的情况。
测量,是每双倍64 KiB 0.79 s 128 KiB 3.16 s × 4.0 256 KiB 12.6 s× 4.0 512 KiB 50.7 s× 4.0 表示大小时间因子的唯一方法.
确切地说,4,3次运行。
这是教科书四重奏: 每次输入双倍,时间四重奏。
外推,十兆字节大约要花五个半小时 这里的要点是:正确性测试没有看到这些。
慢算法产生与快算法完全相同的字节.
套房是绿色的,会永远保持绿色。
修道是两百年了 没有什么需要发明的 分和相接的光子转换是一种古典算法:你不是把数字从一端剥去,而是把数字分成一半——除以一个功率,数字数的一半——每半个重复.
树有与大小相上下相上下相上下相上下相上下相上下相上下相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相相去相去相相去相去相去相相去相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相 512 KiB 50,698 ms 457 ms 111x10 MiB~5.6 h 41.4 s~490xs之后的大小 每双倍的因子从4.00下降到2.82,这也不是任意的数字:这是从将树与快大整数乘法结合得到的.
写之前要检查什么 这与让事情更糟糕的改进是不同的: 分裂和征服只有在你的大整数库的分数是分数时才会得到回报。
如果"分裂"是学校的书, 分出一半和重复仍然是四分法—— 并且有一个比您所要替换的循环更糟糕的常数。
你会写一个更优雅、更难阅读、更慢的算法。
使用中的图书馆后来转而将伯尼克尔-齐格勒递归分出船去,因此得到回报.
在写出第一行之前, 而不是在测量出令人失望的结果之后, 在下一个寄存器库中如何避免 保存5个半小时的问题不是"这个最优化的吗?"而是"命令DER是否改变,还是只改变常数"——它用两个大小和一个分来回答,不是通过读出代码来回答:如果输入数翻了一倍的时间,是线性的;如果是四分之一,是四分之一;如果上升~2.8,后面有一棵树和快乘.
这需要一分钟。
如果有人重新引入一个循环,那么这个测量就应该成为一个失败的测试:成本回归对于正确性套件来说是看不见的,因为代码仍然给出了正确的答案——它只需要五个小时.