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

原创 2013年08月12日 13:57:21

近期微吐槽博言论存档,涉及“性能优化”、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::gmtime_r,而 time.h 定义了 ::gmtime_r。我可不想去背哪些函数是 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 区。

read-perf

能在第 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网络编程。

微信公众号框架之吐槽

先说结论,估计一般人不会有耐心看 我们在一个高压的环境下长大,环境造就人,其实已经超越美国,日本,韩国,你应该知道我在说广电局 例如php,flash,我真见过很废的人,但不代表大环境,大...
  • avi9111
  • avi9111
  • 2016年07月08日 11:46
  • 646

程序员经常说的二十多句话,吐槽吧程序员!

我们来看看程序员经常说的话。 1、明明在我的电脑上是运行正常的啊,为何就。。。。 2、不可能出现这种情况的啊 3、快了,已经完成了90%。 4、这个很简单的,我一个礼拜就能完成...
  • u011405221
  • u011405221
  • 2016年03月17日 19:51
  • 2079

吐槽java之《程序员的呐喊》读后总结

《程序员的呐喊》读后总结 ——关于java的批判 一、写在总结前面的一些废话 《程序员的呐喊》(后文简称呐喊),是一本非常有趣的散篇,全文都是作者对目前软件开发界的看法,主要翻译者也很可爱,用了一些中...
  • qiubaihong
  • qiubaihong
  • 2015年12月19日 02:04
  • 1171

关于人工智能和人类未来的吐槽

围棋人机大赛这件事,帷幕落下已经一个月了。其实这件事本来没太多宏大意义好挖掘的,google玩出来的一手好营销,和我们的猎奇心理一拍即合,搞出一场热闹的表演。要说有什么好处,应该就是给大众普及了Alp...
  • jaguar500
  • jaguar500
  • 2016年04月11日 10:15
  • 212

一个程序员产品开发中的吐槽和体会

一个好的产品就是一个公司的方向,一个公司的未来。我根据我参与过的产品,谈谈一个程序员眼中产品开发的历程和体会。        开始初期阶段就是有公司的高层制定产品的方向,宗旨就是以用户为基础,以获得...
  • TechAlleyBoy
  • TechAlleyBoy
  • 2017年01月09日 23:48
  • 501

对C++的一点吐槽

不得不说C++真是反人类啊。同样一个函数,需要在头文件中声明,在源文件中实现。具体到Qt实现的时候,对于一个小功能,需要在头文件中注册一个Slot,注册一个Signal,声明一个发送signal的函数...
  • u013859301
  • u013859301
  • 2016年12月19日 14:39
  • 266

python学习吐槽

最近学了下python,先从最简单的web开发入手(我指得是相对于后台纯脚本,web开发更简单),直接上flask框架,发现sqlalchemy太重,学习曲线直线上升,换peewee,用了半天老报错,...
  • yao970953039
  • yao970953039
  • 2015年12月12日 17:13
  • 685

web前端深夜吐槽

web前端个人理解:好比如建一间房子,编写HTML就好比把墙和屋顶都建好了,使用CSS就如粉同刷墙,装瓷砖,挂灯,摆设新家具,javascript自然就是给灯装开关,给门装锁,给电视通电等,比较厉害的...
  • xizai2012
  • xizai2012
  • 2015年09月20日 00:39
  • 375

新浪微博优化,可参考大并发

大家下午好,在座的大部分都是技术开发者,技术开发者往往对微博这个产品非常关心。最晚的一次,是12点多收到一个邮件说想了解一下微博底层是 怎么构架的。很多技术人员对微博的构架非常感兴趣,就是一个明星他有...
  • u010703523
  • u010703523
  • 2014年05月19日 09:50
  • 1834

linux内核学习-7重要函数(关注新浪微博:寂寞侵蚀的岁月(4000多篇技术分享))

该程序主要描述了进程(任务)终止和退出的处理事宜。主要包含进程释放、会话(进程组)终止 和程序退出处理函数以及杀死进程、终止进程、挂起进程等系统调用函数。还包括进程信号发送函数 send_sig(...
  • xizmi
  • xizmi
  • 2015年04月21日 12:12
  • 324
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:近期微博吐槽言论存档,涉及“性能优化”、C++陋习等
举报原因:
原因补充:

(最多只允许输入30个字)