近期微博吐槽言论存档,涉及“性能优化”、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 区。
能在第 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++陋习等的更多相关文章
- 转载 近期微博吐槽言论存档,涉及“性能优化”、C++陋习等
http://blog.csdn.net/solstice/article/details/9923615 近期微吐槽博言论存档,涉及“性能优化”.C++陋习等 写C++程序的几个陋习:class 名 ...
- vue-小爱ADMIN系列文章(二):微信微博等分享,国际化,前端性能优化,nginx服务器部署
最近在做我的小爱ADMIN后台管理系统,结合当前市场后台管理系统对相关功能的需求,我又开始新增了一些新的功能和组件,如分享功能组件,项目国际化功能:项目完成后,部署在nginx服务器,发现首次访问的速 ...
- iOS界面流畅技巧之微博 Demo 性能优化技巧
微博 Demo 性能优化技巧 我为了演示 YYKit 的功能,实现了微博和 Twitter 的 Demo,并为它们做了不少性能优化,下面就是优化时用到的一些技巧. 预排版 当获取到 API JSON ...
- 近期业务大量突增微服务性能优化总结-3.针对 x86 云环境改进异步日志等待策略
最近,业务增长的很迅猛,对于我们后台这块也是一个不小的挑战,这次遇到的核心业务接口的性能瓶颈,并不是单独的一个问题导致的,而是几个问题揉在一起:我们解决一个之后,发上线,之后发现还有另一个的性能瓶颈问 ...
- 【腾讯Bugly干货分享】跨平台 ListView 性能优化
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/FbiSLPxFdGqJ00WgpJ94yw 导语 精 ...
- 用Netty开发中间件:高并发性能优化
用Netty开发中间件:高并发性能优化 最近在写一个后台中间件的原型,主要是做消息的分发和透传.因为要用Java实现,所以网络通信框架的第一选择当然就是Netty了,使用的是Netty 4版本.Net ...
- SQL Server数据库性能优化之索引篇【转】
http://www.blogjava.net/allen-zhe/archive/2010/07/23/326966.html 性能优化之索引篇 近期项目需要, 做了一段时间的SQL Server性 ...
- SQL Server数据库性能优化之SQL语句篇【转】
SQL Server数据库性能优化之SQL语句篇http://www.blogjava.net/allen-zhe/archive/2010/07/23/326927.html 近期项目需要, 做了一 ...
- iOS程序性能优化
iOS程序性能优化 一.初级 使用ARC进行内存管理 在iOS5发布的ARC,它解决了最常见的内存泄露问题.但是值得注意的是,ARC并不能避免所有的内存泄露.使用ARC之后,工程中可能还会有内存泄露, ...
随机推荐
- Socket原理与编程基础
一.Socket简介 Socket是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换. 几个定义: (1)IP地址:即依照TCP/IP协议分配给本地主机的 ...
- JAVA-系统-【2】-创建自增长的用户表
[2]创建数据库表 用户表 自增 1.用户表结构 数据excel 表1 2.创建表 Create table A_USER( id number primary key, username ) n ...
- 枚举类valueOf方法的疑问
枚举类中valueOf方法只有一个参数而Enum类中有两个参数,请问Enum实例类中的valueOf方法是从何处继承而来? 答案:jvm进行编译的时候添加的.
- MongoDB是一个介于关系数据库和非关系数据库之间的产品
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型.M ...
- View.setTag(key,object)异常:The key must be an application-specific resource id.
07-11 13:43:26.184: E/AndroidRuntime(10229): FATAL EXCEPTION: main07-11 13:43:26.184: E/AndroidRunti ...
- 《CoffeeScript应用开发》学习: CoffeeScript高级用法
正确的上下文 使用胖箭头=>表示将回调函数绑定到this对象. class t func: (callback)-> if callback? setTimeout callback(), ...
- 如何用grunt压缩文件
grunt-cli 全局装完之后,就可以给每个项目装grunt了. 1.先把package.json和Gruntfile.js拷到项目下(PS:这两个文件是每个项目装grunt的时候必带的) 2. ...
- 基于log4net的支持动态文件名、按日期和大小自动分割文件的日志组件
最近处理一个日志功能,用log4net的配置不能完全满足要求,所以在其基础上简单封装了一下,支持以下功能: 1 零配置 内置默认配置,引用dll后不需要添加或修改任何配置文件也可以使用 2 动态指定文 ...
- CheckedComboBoxEdit 重置初始化值的方法
CheckedComboBoxEdit ccbgb; ccbgb绑定方式ccbgb .Properties .DataSource =数据集; ccbgb.Properties.DisplayMemb ...
- Xrm.Utility.openEntityForm 时404.15 maxQueryString 错误 和 长度超过maxQueryStringLength值 错误
最近的项目里用到Xrm.Utility.openEntityForm 创建新记录时分别碰到以下错误: 以及 这两个错误都是因为想传递给表单的参数太多导致的url 查询参数太长导致的,前者是因为iis的 ...