http://blog.csdn.net/solstice/article/details/9923615

近期微吐槽博言论存档,涉及“性能优化”、C++陋习等

写C++程序的几个陋习:class 名以大写 C 开头,例如 CDate;成员变量以 m_ 开头;变量采用匈牙利命名法;不知道何时禁用 copy-ctor/assign operator。前三个可能是从MFC那里传下来的,当时C++、class、OO是新玩意儿,要与 C struct 区分,现在还这么做就土了。C++的成员变量可用特殊命名格式,加下划线后缀即可(加下划线前缀是错的)。但在 Java 里不必模仿 C++ 的这种成员变量命名方式,IDE 可以让成员变量以不同的颜色显示,与局部变量区分,根本无需特殊命名。写程序就怕把以前的编程经验不加区分地应用到新语言中,写成四不像,不地道。

知道禁用 copy-ctor/assign operator 是 C++ 程序员的试金石。在看到一个开源项目时,我一般会先查看其 RAII handle class 是否禁用了 copy-ctor/assign operator(例如 Thread、Mutex、CondVar、Connection),如果没有,对其第一印象就很差了。

关于 class 命名风格,Google、LLVM、Mozilla、muduo 都采用 Pascal 风格(LikeThis),例如 EventLoop、SudokuSolver 等等。正巧它们也都是用 2 格缩进的,可以用 clang-format 自动格式化代码。

顺便说说我不认同的两个 C++ 教条:1. 用nullptr替换NULL,2. 用cstdio头文件替换stdio.h。

因为例如 gettimeofday(&tv, NULL) 这种系统函数传个 nullptr 进去实在是违和,现在用 NULL 也能达到 nullptr 的好处,大不了在某个头文件里define一下就行。这条将来或许会变。

另外 ctime 头文件没定义 std::gettimeofday,而 time.h 定义了 ::gettimeofday。我可不想去背哪些函数是 C 语言的哪些是 Posix 的,哪些头文件是 C 语言的哪些是 Posix 的(在Linux下,二者基本不分家)。为了用几个系统函数(例如 fcntl() ),我该 include cfcntl 还是 fcntl.h?用线程是 cpthread 还是 pthread.h?我总是记不住 memset() 的参数顺序,因此一般用 bzero() 代替,但是 manpage 说 bzero() 声明于 strings.h,那我要不要考虑试试 cstrings 呢?何必给自己找麻烦,C++ 标准库之外的内容干脆统一用 .h 头文件好了。

性能优化?

有些人常常把“性能”挂在嘴边,而且其以“提高性能”为理由的“优化措施”往往不到点子上,只增加了复杂性和维护难度,降低了代码质量。这属于决策点找偏了。我发现初学者往往过分关注微观(语句级)性能,比方说关心 while(true) 和 for(;;) 哪个更快,++i 与 i=i+1 哪个更快,i/=16 和 i >>= 4 哪个快等等,而忽视了现代编译器的优化能力。

有的人谈性能优化,一是拿不出具体的合理的性能目标,只想越快越好,二是不能实际准确测量验证性能数据,凭感觉和过时经验行事。在编码的时候,遇到两种做法都可行,决策办法是凭感觉猜选“性能会更好”的一种,而忽视了其他更重要的因素。可读性和性能的典型关系如下图,有多少场合是值得为了性能而牺牲代码的可读性和可维护性呢?我希望自己的代码位于第 3 区,而一些人以为自己的代码是在第 4 区,其实是在第 1 区。

能在第 4 区写代码的人属于凤毛麟角,有时候你费劲优化了半天,结果新CPU加了几条指令,直接在硬件层面把问题解决了。现在一些人动不动就要挽起袖子自己写内存池,号称能提高性能,真当 Ulrich Drepper 是水货?(书第 12.2.8 节“有必要自行定制内存分配器吗”)你打算如何测试内存分配器(malloc)的性能?有哪些指标?有哪些影响因素需要控制或模拟(比如线程数)?你的测试结果是否反映实际场景?

杂项

有人问为什么我说“poco不是服务端C++网络库”( http://www.oschina.net/question/12_120943 ),虽然它也提供了reactor?因为它的reactor用的是 Socket::select(),虽然后者包装了epoll,但看其实现就知道,它每次调用都会创建并销毁 epoll fd,然后重建整个watch list,没有哪个服务端网络库会这么做。

嗯,世界上有两种网络编程:网络编程和Windows网络编程。

 

转载 近期微博吐槽言论存档,涉及“性能优化”、C++陋习等的更多相关文章

  1. 近期微博吐槽言论存档,涉及“性能优化”、C++陋习等

    写C++程序的几个陋习:class 名以大写 C 开头,例如 CDate:成员变量以 m_ 开头:变量采用匈牙利命名法:不知道何时禁用 copy-ctor/assign operator.前三个可能是 ...

  2. MySQL性能优化总结(转)https://yq.aliyun.com/articles/24249

    摘要: 一.MySQL的主要适用场景 1.Web网站系统 2.日志记录系统 3.数据仓库系统 4.嵌入式系统 二.MySQL架构图:   三.MySQL存储引擎概述 1)MyISAM存储引擎 MyIS ...

  3. 【转】PHP中被忽略的性能优化利器:生成器.md

      PHP  如果是做Python或者其他语言的小伙伴,对于生成器应该不陌生.但很多PHP开发者或许都不知道生成器这个功能,可能是因为生成器是PHP 5.5.0才引入的功能,也可以是生成器作用不是很明 ...

  4. 转载:SqlServer数据库性能优化详解

    本文转载自:http://blog.csdn.net/andylaudotnet/article/details/1763573 性能调节的目的是通过将网络流通.磁盘 I/O 和 CPU 时间减到最小 ...

  5. Spark性能优化指南——基础篇(转载)

    前言 在大数据计算领域,Spark已经成为了越来越流行.越来越受欢迎的计算平台之一.Spark的功能涵盖了大数据领域的离线批处理.SQL类处理.流式/实时计算.机器学习.图计算等各种不同类型的计算操作 ...

  6. 【转载】我眼中的Oracle性能优化

    我眼中的Oracle性能优化 大家对于一个业务系统的运行关心有如下几个方面:功能性.稳定性.效率.安全性.而一个系统的性能有包含了网络性能.应用性能.中间件性能.数据库性能等等. 今天从数据库性能的角 ...

  7. 【转载】 Spark性能优化指南——基础篇

    转自:http://tech.meituan.com/spark-tuning-basic.html?from=timeline 前言 开发调优 调优概述 原则一:避免创建重复的RDD 原则二:尽可能 ...

  8. Android性能优化文章转载

    今天看到几篇比较好的文章就转了!(链接如下) 转载注明出处:Sunzxyong Android性能优化之Bitmap的内存优化 Android性能优化之常见的内存泄漏 Android最佳实践之Syst ...

  9. 移动H5前端性能优化指南(转载)

    移动H5前端性能优化指南 概述 1. PC优化手段在Mobile侧同样适用2. 在Mobile侧我们提出三秒种渲染完成首屏指标3. 基于第二点,首屏加载3秒完成或使用Loading4. 基于联通3G网 ...

随机推荐

  1. Nodejs Express 4.X 中文API 3--- Response篇

    相关阅读: Express 4.X API 翻译[一] --  Application篇 Express4.XApi 翻译[二] --  Request篇 Express4.XApi 翻译[三] -- ...

  2. MYSQL注入天书之stacked injection

    第三部分/page-3 Stacked injection Background-8 stacked injection Stacked injections:堆叠注入.从名词的含义就可以看到应该是一 ...

  3. vim使用指北 ---- Advanced Editing

    本节介绍vi和ex的一些高级功能. 配置vi 配置文件.exrc可以保存在你的主目录下,在vi启动的时候执行这个配置文件.但在当前工作目录下可以放置一个配置文件,对当前目录做一个自定义配置. :set ...

  4. Codeforces Round #259 (Div. 2) C - Little Pony and Expected Maximum (数学期望)

    题目链接 题意 : 一个m面的骰子,掷n次,问得到最大值的期望. 思路 : 数学期望,离散时的公式是E(X) = X1*p(X1) + X2*p(X2) + …… + Xn*p(Xn) p(xi)的是 ...

  5. 从Config文件中读取节点的配置信息

    下面是web.config中与本内容有关的细节 <appSettings> <add key="servername" value="www" ...

  6. 【HDU 5030】Rabbit's String (二分+后缀数组)

    Rabbit's String Problem Description Long long ago, there lived a lot of rabbits in the forest. One d ...

  7. VS2012如何更新下载TFS上面的代码到本地

    现在的代码基本上全都放在TFS上面,如何同步TFS上面的code呢? 1. Open "Team Explorer - Home" 2. Click "Source Co ...

  8. Bridging signals---hdu1950(最长上升子序列复杂度n*log(n) )

     题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1950 一直只知道有除n*n的算法之外的求LIS,但是没学过,也没见过,今天终于学了一下,dp[i]表 ...

  9. C++:delete和delete[]释放内存的区别

      C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[].  关于 new[] 和 delete[], ...

  10. chrome开发配置(三)安装开发工具

    1.安装 VisualStudio2010,设置环境变量 GYP_MSVS_VERSION=2010 2.安装 VisualStudio2010 SP1 3.安装 windows 8.0 sdk(不要 ...