随笔分类 -  C++编程

摘要:短网址服务设计背景短网址服务,用来将输入的一个长网址转换为一个短网址(比如附录中的案例),当用户请求这个短网址时,服务查询出真实的url; 设计这么一个短网址服务,需要考虑哪些点?数据结构首先,需要考虑短网址应该如何存储,使用一个key-value结构就可以; key是生成的短网址,具有唯一性... 阅读全文
posted @ 2015-11-06 17:34 大CC 阅读(4147) 评论(1) 推荐(1) 编辑
摘要:C++11带来的优雅语法 自动类型推导 auto auto的自动类型推导,用于从初始化表达式中推断出变量的数据类型。通过auto的自动类型推导,可以简化我们的编程工作; auto是在编译时对变量进行了类型推导,所以不会对程序的运行效率造成不良影响; 另外,似乎auto也并不会影响编译速度,因为编译时本来也要右侧推导然后判断与左侧是否匹配。 auto a; // 错误,auto是... 阅读全文
posted @ 2015-09-11 14:10 大CC 阅读(19721) 评论(0) 推荐(8) 编辑
摘要:C++11在时空性能方面的改进 这篇我们聊聊C++11在时间和空间上的改进点; 主要包括以下方面: 新增的高效容器:array、forward_list以及unordered containers; 以及常量表达式、静态断言和move语义; 大小固定容器 array std::array是一个支持随机访问且大小(size)固定的容器,它是c++11中新增的容器。它有如下... 阅读全文
posted @ 2015-09-07 10:56 大CC 阅读(5789) 评论(2) 推荐(3) 编辑
摘要:C++11中对类(class)新增的特性 default/delete 控制默认函数 在我们没有显式定义类的复制构造函数和赋值操作符的情况下,编译器会为我们生成默认的这两个函数: 默认的赋值函数以内存复制的形式完成对象的复制。 这种机制可以为我们节省很多编写复制构造函数和赋值操作符的时间,但是在某些情况下,比如我们不希望对象被复制, 在之前我们需要将复制构造函数和赋值操作... 阅读全文
posted @ 2015-09-02 11:06 大CC 阅读(6761) 评论(0) 推荐(1) 编辑
摘要:当优化扩展到多核时 "软件开发没有银弹,我们能做的就是选择和平衡;" 上一篇文章我们聊了在单线程下程序优化的5个方向(ref:《程序优化的5个方向》);当单核优化到极值后,就到了多任务的情况; 想起来很清晰,单个任务分解成多个任务,让多个cpu同时来工作,并行执行,效率自然就上去了; 但,未必就这么简单; 任务分解的粒度 首先,我们需要确定,我们的单个任务是否可以分解;比如... 阅读全文
posted @ 2015-08-13 09:33 大CC 阅读(1088) 评论(1) 推荐(1) 编辑
摘要:程序优化的5个方向80/20法则:程序执行中,80%的时间消耗在20%的代码上。 优化前,我们首先得找到这20%的关键路径; 各种语言都有专门的工具来找到这20%的关键路径,比如C++经常用到的gprof;参考《C++的性能优化实践》在关键路径上对耗时的计算进行优化; 主要的优化方向为... 阅读全文
posted @ 2015-08-07 07:53 大CC 阅读(3849) 评论(5) 推荐(5) 编辑
摘要:消除临时对象在我们的代码中,有些临时对象正在使用而我们并未察觉; 性能优化时,消除临时对象,特别是大的临时对象,对提升性能效果明显; 这里列出常见的临时对象产生的地方:按值返回按值返回函数结果,结果就是一个临时对象string add(string s1,string s2){ str... 阅读全文
posted @ 2015-08-06 10:00 大CC 阅读(1055) 评论(2) 推荐(1) 编辑
摘要:Redis数据导入工具优化过程总结背景使用C++开发了一个Redis数据导入工具 从oracle中将所有表数据导入到redis中; 不是单纯的数据导入,每条oracle中的原有记录,需要经过业务逻辑处理, 并添加索引(redis集合); 工具完成后,性能是个瓶颈;优化效果使用... 阅读全文
posted @ 2015-06-30 07:49 大CC 阅读(2661) 评论(2) 推荐(0) 编辑
摘要:清楚利弊,用好内联内联的语法在类声明中定义方法;内联方法放在类声明之外,但必须出现在头文件中,且内联方法声明中使用inline标识;注:inline只是对编译器的建议,是否内联的决定权在编译器;内联节省的开销函数调用开销调用间优化 优秀的编译器可是内联方法的边界难以区分(将代码内联后,对代码进行重新... 阅读全文
posted @ 2015-06-29 22:58 大CC 阅读(1300) 评论(0) 推荐(0) 编辑
摘要:STL区间成员函数及区间算法总结在这里总结下可替代循环的区间成员函数和区间算法;相比单元素遍历操作,使用区间成员函数的优势在于: 1)更少的函数调用 2)更少的元素移动 3)更少的内存分配在区间成员函数不适用的情况下也应该使用区间算法,至少,相比手写循环而言,它更加简单,有效,并且不... 阅读全文
posted @ 2015-06-29 07:46 大CC 阅读(2708) 评论(0) 推荐(1) 编辑
摘要:高效的使用STL仅仅是个选择的问题,都是STL,可能写出来的效率相差几倍; 熟悉以下条款,高效的使用STL;当对象很大时,建立指针的容器而不是对象的容器1)STL基于拷贝的方式的来工作,任何需要放入STL中的元素,都会被复制; 这也好理解,STL工作的容器是在堆内开辟的一块新空间,而我们自己的... 阅读全文
posted @ 2015-06-23 23:11 大CC 阅读(5977) 评论(3) 推荐(6) 编辑
摘要:常用的STL查找算法《effective STL》中有句忠告,尽量用算法替代手写循环;查找少不了循环遍历,在这里总结下常用的STL查找算法;查找有三种,即点线面: 点就是查找目标为单个元素; 线就是查找目标为区间; 面就是查找目标为集合;针对每个类别的查找,默认的比较函数是相等,为了... 阅读全文
posted @ 2015-06-10 07:49 大CC 阅读(13722) 评论(1) 推荐(2) 编辑
摘要:C++ Redis mset 二进制数据接口封装方案需求C++中使用hiredis客户端接口访问redis; 需要使用mset一次设置多个二进制数据以下给出三种封装实现方案;简单拼接方案在redis-cli中,mset的语法是这样的:/opt/colin$./redis-cli mset a 11 ... 阅读全文
posted @ 2015-02-09 07:45 大CC 阅读(7730) 评论(0) 推荐(2) 编辑
摘要:const变量赋值报错分析const变量赋值报错从变量到常量的赋值是合法C++的语法约定的, 如从char 到const char顺畅; 但从char **到 const char **编译器就会报错:error: invalid conversion from `char**' to `c... 阅读全文
posted @ 2015-02-06 09:21 大CC 阅读(3355) 评论(0) 推荐(0) 编辑
摘要:工厂模式和策略模式看着很像,经常让人混淆不清; 它们的区别在哪里,需要细细体味;相似点在模式结构上,两者很相似;差异用途不一样 工厂是创建型模式,它的作用就是创建对象; 策略是行为型模式,它的作用是让一个对象在许多行为中选择一种行为; 关注点不一样 一个关注对象... 阅读全文
posted @ 2014-06-24 07:42 大CC 阅读(39692) 评论(11) 推荐(9) 编辑
摘要:Berkeley 四种产品如何选择?四种产品综览Berkeley 可供选择的四款产品:DS: 简单的、支持单写单读的数据存储;支持高并发,多进程同时读操作;不支持锁,这就意味着当程序在进行更新和读操作同时进行的时候,他无法保证数据的正确性;DS适用于只读类应用或者程序方面能保证同一时间只有不操作一个线程在进行更新数据;CDS:支持多读单写;内建并发支持,提供锁机制;TDS:提供支持事务的数据存储,支持完整的ACID特性,支持数据恢复;HA:提供高可用性的解决方案,支持数据主从同步;(需要有事务支持)Concurrent Data Store (CDS)支持多读单写;内建并发支持,提供锁系统;C 阅读全文
posted @ 2013-11-14 07:46 大CC 阅读(1310) 评论(0) 推荐(0) 编辑
摘要:比Redis更快:Berkeley DB面面观Redis很火,最近大家用的多。从两年前开始,Memcached转向Redis逐渐成为潮流;而Berkeley DB可能很多朋友还很陌生,首先,我们简单的介绍一下。Berkeley DB介绍历史悠久。Berkeley DB1991年发行第一版, 2006年被Oracle收购;Berkeley DB是一个嵌入式数据库系统,将其归类到内存数据库范畴没有问题;使用Key-Value结构存储,本身不支持SQL,5.5版以后整合了SQLite,可使用sql进行查询;官方资料给出的评估是如果原生的bdb能让性能提升10倍,使用SqlLite之后,大概就只有2- 阅读全文
posted @ 2013-10-30 22:51 大CC 阅读(16095) 评论(7) 推荐(5) 编辑
摘要:由于性能原因,我们打算将关系型数据库转移到内存数据库中;在内存数据库产品的选型中,我们确定的候选对象有Redis和Berkeley DB;Redis查询效率不错,并且支持丰富的数据存储结构,但不支持多索引,这样对于比较复杂的sql移植可能会造成数据膨胀;Berkeley DB只支持简单的Key/Value, 但支持多索引查询,对我们目前的应用来说,移植起来更有优势;下面我们看看,如何为DB建立二级索引;还是用例子来说明:一张表中记录学生的信息;每个学生有个唯一的ID,这个id通常就是表的主键;现在,我们希望通过学生的last_name来查询,这就需要建立二级索引;注:用词约定:* 本文提到的“ 阅读全文
posted @ 2013-09-26 07:56 大CC 阅读(5082) 评论(1) 推荐(1) 编辑
摘要:1 导言首先,我们要了解Berkeley DB的一些基本特性,在IBM的开发网站上有篇文章对其有比较清晰的介绍;这篇文章讲到了BDB的设计思想和核心数据结构、以及数据访问算法;并有常用函数使用范例;算是接触BDB的一个入门好材料;进入以下url阅读:http://www.ibm.com/developerworks/cn/linux/l-embdb/index.html我现在的问题是,我们需要使用BDB的话,有以下问题需要解决:如何使用各个常用操作?数据访问算法的选择?性能如何?需要做一个贴近实际的性能测试;BDB支持多索引,那么多索引是如何建立的?针对特定环境,如何建立合适的索引?如何封装, 阅读全文
posted @ 2013-09-17 07:26 大CC 阅读(28636) 评论(0) 推荐(1) 编辑
摘要:优化准则: 1. 二八法则:在任何一组东西中,最重要的只占其中一小部分,约20%,其余80%的尽管是多数,却是次要的;在优化实践中,我们将精力集中在优化那20%最耗时的代码上,整体性能将有显著的提升;这个很好理解。函数A虽然代码量大,但在一次正常执行流程中,只调用了一次。而另一个函数B代码量比A小很... 阅读全文
posted @ 2013-06-05 08:00 大CC 阅读(16107) 评论(8) 推荐(6) 编辑

木书架 大CC的博客