转: 在创业公司使用C++

时间:2022-09-01 13:46:20

from: http://oicwx.com/detail/827436

在创业公司使用C++

2016-01-04开发资讯

James Perry和朋友创办了一家公司,主要是做基于云的OLAP多维数据集。因为他最熟悉C++,所以在构建OLAP引擎时,也选择了自己最擅长的语言。最初曾用Rust构建过一个原型版本,不过后来感觉风险很高,便放弃了。

很多同事也感觉奇怪,为什么选择C++,却不用Ruby或Python之类的动态语言来开发云服务呢,毕竟后者开发交付的效率高很多。

James撰文(https://medium.com/swlh/starting-a-tech-startup-with-c-6b5d5856e6de)解释了他的理由。

可以从两个维度来看。

一.开发效率

 


C++并非动态语言,但是现代C++(C++11/14)提供了类型推导。人们对C++有很多误解,比如认为在用C++时,必须使用原生指针(raw pointer),必须输入长长的命名空间或类型信息,还要手动管理内存。而有了auto特性,开发者不必再输入那么多长长的类名和命名空间信息,C++会用类型推导来推断变量的类型。

转: 在创业公司使用C++

手动管理内存也是最常见的误解。从C++11开始,一般建议使用std::shared_ptr或std::unique_ptr自动管理内存。这要比手动管理安全很多。

转: 在创业公司使用C++

要快速构建服务或产品,高质量的库也是不可或缺的。不过在James看来,C++标准库还严重缺乏一些基本功能,而且有些API性能很差(比如从iostreams读文件)。Facebook提供了很多高质量的库,在构建OLAP云服务时帮助很大。

1.Folly(https://github.com/facebook/folly/)

这是一个不错的C++库,有很多高性能的类。James在其引擎中用到了fbvector、fbstring等类,与std::vector和std::string相比,它们性能更好。另外像Future,原子化的无锁数据结构也经常用到。

Folly的容器性能很好(可以参阅:https://github.com/facebook/folly/blob/master/folly/docs/FBVector.md)。

另外,阅读Folly的代码对C++程序员成长也有很大帮助。

2.Proxygen(https://github.com/facebook/proxygen)

Proxygen是Facebook开发的一个异步HTTP服务器。James使用Proxygen作为HTTP服务器,将JSON数据插入到OLAP引擎,或从引擎获得JSON数据。只需要一天,就能创建一个调用引擎的高性能服务器。

James将其与Python Tornado服务器做了对比,在一个EC2实例上,使用200个HTTP连接,C++/Proxygen每秒可以处理1 990 130个请求,Python/Tornado每秒可以处理41 329个请求。

3.Wangle(https://github.com/facebook/wangle)

James的OLAP引擎本质上是一个分布式的数据库,用于存储和查询多维数据。该引擎以Wangle作为应用服务器的基础。所有的逻辑都分解到了Wangle handler中,可以链到一起构成一条流水线。每个服务器都是对称的,是相同的二进制可执行程序,没有主从之分。每个服务器节点可以通过定制的二进制协议交换数据或消息。

二.硬件、人力成本

 


根据前面HTTP基准测试,一台C++服务器的处理能力大约相当于40台负载均衡的Python服务器。服务器成本大幅减少。另外,如果开始选择Python,公司发展到某个阶段,需要提高服务器性能时,可能需要用C++重写,其实会浪费人力。

总结

 


对于创业公司而言,C++可能并非最流行的选择,但现代C++确实是可行的选择之一,它可以提供接近C的性能和更高层的抽象。随着代码量的增长,构建时间可能是个问题,不过C++17的模块应该可以解决之。