商丘市住房和城乡建设厅网站,设计师怎么弄个人网站,wordpress页面宽度改为全屏,网站开发任务完成情况最近看完了《C性能白皮书》#xff0c;这本书列出了一些性能优化的思路#xff0c;不过只是一些指引#xff0c;没有讲具体细节#xff0c;我整理出了其中的关键点分享给大家#xff1a; 硬件篇
作为一个程序员#xff0c;想要性能优化#xff0c;最好要了解些硬件性能白皮书》这本书列出了一些性能优化的思路不过只是一些指引没有讲具体细节我整理出了其中的关键点分享给大家 硬件篇
作为一个程序员想要性能优化最好要了解些硬件特别是CPU架构的一些知识点 流水线 分支预测 寄存器重命名 数据预取 指令重排和乱序执行 同时多线程超线程 数据并行 SIMD 单指令多数据
还要了解CPU的特点 一个处理器上多条指令可能同时执行 一个处理器上代码的执行结果会和程序员可观察到的顺序一致但其他处理器观察到的执行结果可能不是一个顺序 顺序、无跳转的代码性能最高 相邻且对齐的数据访问性能最高
内存方向的优化 要了解基本工具 编译器MSVC GCC clang 不同级别的优化O1 O2 O3 以及他们的主要区别 需要知道性能分析指导下的优化PGO profile-guided optimization 也就是利用程序运行的profiling数据指导编译器进一步优化。多测试找到程序热点根据数据针对性优化。 还有链接期优化link-time optimization LTO LTO可以 跨翻译单元的函数内联 跨翻译单元的程序整体优化 死代码消除 做性能优化需要了解性能测试的阿姆达尔定律80-20原则20%的代码决定了80%的结果如果对20%以外的代码进行优化性价比太低性能测试的意义就在于此 找出代码中性能开销最大的部分 测量代码优化之后的实际收益 需要熟练使用性能采样工具 Windows中Visual Studio有自带的性能分析工具 Linux有Perf或者gperftools C篇
关于C语言层面的优化可以在下面这些方向做优化 优先栈内存次之堆内存 巧妙使用RAII管理资源 移动语义虽然不好理解但也可以巧妙使用移动语义减少对象的非必要拷贝 模板和泛型技巧华而不实给开发标准库的人使用还好而且调试难度也较高我们普通业务开发者只需要做到能看懂即可个人见解 异常是可以考虑使用的可以看看ISO C网站和C 核心指南62异常会导致程序的二进制体积有膨胀5%-15%异常不能代替所有的错误码因为异常catch会使得程序性能下降。作者认为使用异常对于大部分C项目仍然适用不使用异常的麻烦大于好处除非真因为二进制文件和实时性方面的原因需要禁用异常。 字符串默认类型时 const char[]传参时会退化成const char*创建全局字符串最好使用const char[] 标准库容器的方法至少提供了基本异常安全保证要了解强异常安全保证和无异常保证。 vector的移动构造函数标记为noexcept才会使用移动构造移动构造函数需要标记为noexcept如果没有标记代码性能可能会有较大的负面影响。 shared_ptr构造优先使用make_shared
10.了解functionfunction用作回调很方便支持类型擦除它还有个好处可以用来存储带状态的函数对象不像C语言那样需要个void*存储状态。但需要了解它的开销貌似48个字节是个坎。
11.堆内存管理可以了解下jemalloc mimalloc tcmalloc
12.输入输出流可以考虑使用ios_base::sync_with_stdio(false)关闭同步性能会提升也最好使用\n取代endl免得频繁刷新缓冲区。可考虑使用fmt
13.并发 需要了解内存序的概念 一些优质的多生产者多消费者并发队列 moodycamed::ConcurrentQueue atomic_queue Folly中MPMCQueue 标准库也有些并行策略 execution::seq 序列执行不可并行 par可并行化 par_unseq可并行化 向量化 unseq可向量化 通用方法篇
通用优化方法 优化原则不要执行不必要的代码 循环优化尽量减少临 时对象的创建 结构体设计时最好做到对齐 尽量顺序访问数据矩阵乘法可以很好的印证CPU Cache的作用再考虑添加-O3 -marchnative开启SIMD自动向量化 缓存争用问题 多看看别人的代码别人的优化多用优秀的开源代码 获取更多资源关注公众号;奇牛编程