计算机体系结构确认
读取缓存外的数据为什么较慢?
- 发生缓存未命中时 CPU 会降低时钟频率等待
- 因为必须往返主内存
- 缓存中没有的数据总会继续到磁盘读取
- 节能功能会刻意降低内存访问速度
内存每次会取回多少数据?
- 只精确取回请求的 1 字节
- 一次取回整个缓存行,通常为 64 字节
- 按虚拟内存页一次取回 4KB
- 按请求大小只取所需的数据
按顺序读取数组为什么更快?
- CPU 分支预测器预先识别了循环
- 编译器只会优化顺序访问代码
- 一次取回的缓存行中可免费使用多个值
- 随机访问的测量不稳定,只是偶然显得较慢
0.1 + 0.2 == 0.3 为什么为假?
- 因为 0.1 无法用有限二进制准确表示
- 因为 Python 的浮点实现存在缺陷
- 因为默认精度设置减少了小数位数
- 因为输出时的舍入设置改变了值
为什么不应使用 float 计算金额?
- 舍入误差会累积,导致金额出现 1 元偏差
- 它比整数运算慢,会降低吞吐量
- float 比整数占用更多内存
- 不同机器的 float 表示不同,不具可移植性
1e16 + 1 - 1e16 与 1e16 - 1e16 + 1 的结果为什么不同?
- 两个表达式的运算符优先级不同
- 给大数加上小数时,小数会因精度不足而消失
- 1e16 在中途转为整数,导致值改变
- 浮点加法实现存在缺陷
为什么网络字节序规定为大端序?
- 不同机器要以同样方式读取同一数值,必须有统一约定
- 大端序的处理速度比小端序快
- 使用大端序的机器更多,所以遵循多数
- 颠倒字节顺序会使窃听者难以读取数值