浅谈卡常数

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

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


  1. 处理多组数据时写 for ( ; T; --T) 最高效
  2. 短路运算、三目运算比 if
  3. ++ii++ 快,--ii--
  4. 逗号运算符比分号快
  5. 取模 % 是最慢的运算
  6. long long 的常数是 int 的两倍
  7. 访问数组元素比访问单个变量慢很多
  8. int最快的,甚至比 bool 还要快
  9. memset/memcpyfor 循环赋值快很多
  10. define 实现 min/max 容易造成重复计算,增大常数
  11. 访问最频繁的几个变量应该丢进寄存器
  12. 在浮点数运算中应尽量减少 / 的运算次数
  13. 1ll*x*y%P(ll)x*y%P
  14. 若答案对一个 int 范围内的数取模,则绝大部分变量都不必开 long long
  15. 尽量避免使用 STLsort 除外
  16. 一般 unordered_mapmap
  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 评论

留下您的评论.