浅谈卡常数

然而只是个简单的整理而已 也就自己看看
大概是个备忘录的样子?

UPD on 2023/1/1 :
声明一下,这篇文章的内容可能有错误,请不要轻易相信,除非你已经写代码验证过了
为啥不修锅?因为我懒,,
就这样


  1. 处理多组数据时写 for ( ; T; --T) 最高效
  2. 短路运算、三目运算比 if 快
  3. ++i 比 i++ 快,--i 比 i-- 快
  4. 逗号运算符比分号快
  5. 取模 % 是最慢的运算
  6. long long 的常数是 int 的两倍
  7. 访问数组元素比访问单个变量慢很多
  8. int 是最快的,甚至比 bool 还要快
  9. memset/memcpy 比 for 循环赋值快很多
  10. 用 define 实现 min/max 容易造成重复计算,增大常数
  11. 访问最频繁的几个变量应该丢进寄存器
  12. 在浮点数运算中应尽量减少 / 的运算次数
  13. 1ll*x*y%P 比 (ll)x*y%P 快
  14. 若答案对一个 int 范围内的数取模,则绝大部分变量都不必开 long long
  15. 尽量避免使用 STL , sort 除外
  16. 一般 unordered_map 比 map 快
  17. 合理使用位运算优化 * , / 和 %
  18. 不要使用cin/cout
  19. 输出字符时 putchar 是很快的,输出字符串时 puts 是很快的
  20. 若函数体内包含循环但循环次数很少,可以使用inline
  21. 包含递归、循环(第20条情况除外)或者函数体较长的函数不要加 inline
  22. strlen 的复杂度是线性的,最好把结果存到变量里使用
  23. clock() 测用时很准,但注意过多调用它也会影响程序效率
  24. 慎用预处理,即使可以避免重复计算(理由见第7条)
  25. 尽量不使用long double,它的常数很大
  26. 浮点数除法很慢,应使用交叉相乘等技巧尽量减少除法运算次数
  27. 尽量紧凑关系密切的代码,即使这样会导致码长增加
  28. 写 FFT\rm FFTFFT 时应当预处理三角函数值(这属于第24条中的“慎用预处理”)
  29. 与第28条相反,写 NTT\rm NTTNTT 时不应预处理乘方值
  30. 不要相信网上流传的40行优化,其中大部分都很少起到作用
  31. Ofast\rm OfastOfast 优化是较为有效的一种优化(这不属于第30条中的“大部分”)
  32. 应尽量让小数组的大小能够卡进cache
  33. 在理论复杂度相同时,迭代实现往往比递归实现更快
  34. 在循环展开可能破坏代码的结构和可读性时,慎用循环展开
  35. 不应为简化代码而舍弃效率(第34条情况除外)

本文链接:https://my.lmcjl.com/post/7561.html

展开阅读全文

4 评论

留下您的评论.