这两天用 c++重写了一段用 node 写的后端程序,相同的业务逻辑,mongodb 的 CURD 操作之类的,没用奇巧淫记没有任何优化,编译出来的程序响应速度实测比 node 快 10 倍左右,虽然 c++写起来麻烦一点点但为了性能还是 ok 的,v 友门公司用 c++写后端的多吗?
1
Puteulanus 2019-08-22 18:31:18 +08:00 4
你试试 golang
|
2
augustheart 2019-08-22 18:36:46 +08:00 2
恭喜你重新发现了真理。
|
3
MeteorCat 2019-08-22 18:38:24 +08:00 via Android 2
然后你用 rust 写,就会发现双倍快乐
|
4
janxin 2019-08-22 18:38:30 +08:00
你跟 node 比并发不是欺负人么...
|
5
chinvo 2019-08-22 18:40:00 +08:00 via iPhone
有一部分项目用的 rust,主要用的 .net core,还有一部分项目是 PHP、python 的
只能说编译型语言比解释型快是必然的 |
6
xujif 2019-08-22 18:45:27 +08:00 14
快 10 倍,不太可能啊。show 一下 code ?你要是 cpu 密集型 10 倍也就算了,mongodb 这样的 io 调用能快 10 倍?
|
7
impl 2019-08-22 18:47:37 +08:00 via Android
node 不是用来写 web 的吗
|
8
salamanderMH 2019-08-22 19:24:40 +08:00 via Android
编译的肯定快
|
9
cest 2019-08-22 19:34:58 +08:00 1
这样 cpu/ram 厂商怎麽办? 都用真语言写,那硬体需求一下减半,要还真 optimize 下,那业界大萧条
多找培训班的,这样业界才有希望 |
10
learningman 2019-08-22 19:45:01 +08:00 via Android 1
@cest 整个互联网拿汇编重构,直接跃进 20 年
|
11
zeroDev 2019-08-22 19:47:12 +08:00 via Android
@learningman 那怕是写不来
|
12
wisan 2019-08-22 20:55:50 +08:00 via Android
@Puteulanus golang 性能差 c++ 5 倍
|
13
ochatokori 2019-08-22 21:05:05 +08:00 via Android
mihoyo 就是 c++的
|
15
taogen 2019-08-22 21:20:08 +08:00 via Android 2
PHP 天下第一
|
17
laminux29 2019-08-22 21:58:58 +08:00 1
编程语言,分为两类。一类像汇编 /C/C++,尽量与低级硬件直接打交道,运行效率最高,最省内存。但缺点是,开发效率最差,调试很不方便。
另一个极端,是像 PHP、Python、js 这种的,写完代码文件直接可以双击运行,这类开发效率最高,调试方便,但就是运行效率最差,最浪费内存。 以上是天平的两个极端。 然后是其他语言,比如 Java/C#是偏向于开发效率、go 偏向于运行效率,等等。 |
18
byteli 2019-08-22 22:54:19 +08:00 via Android
cpu 密集型? io 密集的话 cpp 没有明显优势
|
19
clino 2019-08-22 23:12:10 +08:00 via Android
不会 rust,但感觉 rust 应该是个更好的选择,微软都推荐了
|
20
cz5424 2019-08-22 23:27:26 +08:00 via iPhone
@ochatokori 游戏要求高实时性
|
21
hhyvs111 2019-08-23 00:14:20 +08:00
go 能写游戏服务端吗
|
23
rainymorn 2019-08-23 04:35:31 +08:00 1
然而,PHP 工作多啊
|
24
takemeh 2019-08-23 05:15:41 +08:00
这套简易网盘 /t/497773 完全是 C 写的, 可以体验一下速度
@augustheart @byteli @cest @chinvo @clino @cz5424 @GM @hhyvs111 @impl @janxin @laminux29 @learningman @MeteorCat @ochatokori @ppokyou @Puteulanus @rainymorn @salamanderMH @taogen @wisan @xujif @zeroDev |
25
zuikren 2019-08-23 05:54:50 +08:00 via Android
试试 golang
|
27
lihongjie0209 2019-08-23 08:45:40 +08:00
io 密集型的任务差这么多, 你让前几年大火的 Python 情何以堪
|
28
araraloren 2019-08-23 09:04:33 +08:00
个人觉得说起调试来,编译语言的工具链是最方便的
|
30
MaiKuraki 2019-08-23 09:32:09 +08:00
666
|
32
clino 2019-08-23 09:48:34 +08:00
@Keyes https://www.oschina.net/news/108368/microsoft-is-exploring-to-use-rust-as-more-secure-code
微软正探索将 Rust 作为 C 和 C++ 的安全替代方案 |
33
augustheart 2019-08-23 09:49:58 +08:00
@clino 微软冗余人员多,项目组多,啥都能掺和一脚。而且那也只是微软安全组的人推荐而已。你让微软拿 rust 重写个记事本试试,保证头摇得比谁都快。
rust 也没有吹的那么牛,先不说一大票库的版本号还在 0.x 甚至 0.0x 的阶段,rust 的优势也只是画地为牢,不安全的事都不让你做,从而避免水平不够的人写出安全代码。但它总体性能超过上 c/c++是不可能的,就算用 unsafe 生成的代码都不如 c/c++直接。而说到开发效率那就更没法谈了,rust 的开发效率怕是比 c 还差点。 |
34
augustheart 2019-08-23 09:50:42 +08:00
@augustheart 从而避免水平不够 ->从而保证水平不够
|
35
clino 2019-08-23 10:02:54 +08:00
@augustheart 我自己刚试用了 rust 开发的一款和 lucene 功能类似的 fts 引擎 tantivy,在 python 里安装和调用起来都非常方便,实测性能也很好,所以我对 rust 印象很好,认为它的开发效率应该也很不错
|
36
fyyz 2019-08-23 10:06:11 +08:00
你说的后端是指 Web 后端吗?
|
37
tt67wq 2019-08-23 10:09:38 +08:00
瓶颈不都在数据库那边吗?换个语言怎么会有改善?
|
38
augustheart 2019-08-23 10:12:31 +08:00
@clino 太繁琐了,为了安全增加了很多心智负担,编译通过都很费事。
我个人其实挺喜欢这个语言,但是不觉得它适合快速开发。它的性能只是相对其它语言来说而已,没有 gc,静态编译这两点就是性能的保证了。但是从机器码的层次来看,至少目前相对 c++还是太啰嗦了。c++那丧心病狂的编译时间带来的优化程度别的语言还是挺难赶上的。 谈到性能,c/c++的指针往那一站,除了汇编,别的语言都是直接抬下去的命……(不谈针对某些方面特别优化的专用语言,比如据说比 c 还快的 fortran,我没用过,听同事吹过) |
39
SuperMild 2019-08-23 10:15:00 +08:00
@augustheart rust 开发效率比 C 差??恐怕全世界只有 Linus 同意你这个说法。
你提到一点很有意思:rust 的优势是不安全的事都不让你做,从而保证水平不够的人写出安全代码。 这正是 rust 的巨大优点,也是 rust 主要想解决的问题。运行效率 c/c++ 之下其他语言之上,但注意了,水平不够的人也能用好!达到这个高的运行效率,还能轻松确保内存安全,这就非常诱人了好吗。 c/c++是可以运行效率高那么一丢丢,但是写起来要么提心吊胆的,要么必须水平很够(这对于程序员来说是学习成本,对于公司来说是招人成本)。 |
40
dosmlp 2019-08-23 10:15:30 +08:00
差 10 倍很正常,很多人其实不知道 c++性能有多强,总以为其他语言的性能已经接近 C++了,其实差的远,更不用说这还没优化
|
41
clino 2019-08-23 10:15:48 +08:00
@augustheart 我理解你说的编译通过费事实际上是把 C/C++运行时容易出的问题提前在编译期间基本解决了? 如果是这样的话,应该是对开发效率的一大增强阿,C/C++指针跑飞 debug 有时候是很痛苦的.
|
42
augustheart 2019-08-23 10:16:22 +08:00
@tt67wq 光调用函数这一点就能省下很多时间。动态语言调用库函数很慢的。
但是是不是有这么高我就没有数据了。 |
44
augustheart 2019-08-23 10:20:02 +08:00
@clino 你看过那个笑话嘛,凌晨三点,办公室灯火辉煌。c++程序员正在编译程序,rust 程序员正在让程序通过编译。原文不记得了,还说了挺多其它语言的。当时看了乐坏了。
那个所有权系统太难缠了。 |
46
tt67wq 2019-08-23 10:20:50 +08:00
@augustheart #42 就算快 10 倍,跟数据库 IO 比起来,不是一个量级的,一次读数据库,有网络 IO,读内存,慢点的还要读磁盘,你 c++这些都是没法优化的,动态的函数调用再慢也不会有这么大影响吧
|
47
augustheart 2019-08-23 10:23:23 +08:00
@tt67wq 是的,所以我也说了是不是这么我高没有数据。
而且楼主也没说他具体在各个阶段上到底花时间多少,如果数据库上花的时间少,调用的消耗不就突出了呗。 |
48
tt67wq 2019-08-23 10:24:48 +08:00
@augustheart #47 如果是 CPU 密集的确实没法比,10 倍都是谦虚了
|
49
no1xsyzy 2019-08-23 10:28:41 +08:00
@augustheart 运行效率死吹 C/C++ 的可别了吧
“另外一些 函数式语言也能生成高效的代码,比如 OCaml。在一次程序语言暑期班上,Cornell 的 Robert Constable 教授讲了一个故事,说是他们用 OCaml 重新实现了一个系统,结果发现 OCaml 的实现比原来的 C 语言实现快了 50 倍。经过 C 语言的那个小组对算法多次的优化,OCaml 的版本还是快好几倍。这里的原因其实在于两方面。第一是因为函数式语言把程序员从底层细节中解脱出来,让他们能够迅速的实现和修改自己的想法,所以他们能 够迅速的找到更好的算法。第二是因为 OCaml 有高效的编译器实现,使得它能生成很好的代码。” 精通 Rust 和熟练使用 C 哪个写出来的运行快? C 写了个运行时判断是否需要回收的(自行实现引用计数),当然不如 Rust 写的编译时决定的。 |
50
u823tg 2019-08-23 11:06:45 +08:00
@augustheart 写的多了,写顺了效率还不错。
|
51
augustheart 2019-08-23 11:08:00 +08:00 1
@no1xsyzy 特例就别拿出来了吧。python 跑得比 c 快的例子又不是不存在。无论多高效的编译器,最终它还是要变成机器码在 cpu 上跑的。生成的机器码的性能,我可以把话说死了,上限就在 c 这块。
至于你后面那段,我就先不纠结你这个精通与熟练的语言把戏了。c 原教旨主义的那帮人才不用引用计数器这种低效玩意呢。那是 c++才爱干的事。不能在自己脑瓜子里面想清楚资源的所有生命周期的也敢自称熟练使用 c ? |
52
augustheart 2019-08-23 11:10:29 +08:00 1
@u823tg 写顺了那就真的基本可以说精通 rust 了。容我先膜拜一下。我学 rust 已经从入门到放弃两次了,眼看第三次要接近了……
|
53
u823tg 2019-08-23 11:12:53 +08:00
@augustheart 两次放弃,你这是光学不练吧。
|
54
augustheart 2019-08-23 11:13:53 +08:00
@SuperMild 其实你的说法我很赞同。我虽然每天写的是 c++,但是其实我真的不是 c/c++吹,只是想描述清楚一个真正的 c/c++而已……
|
55
augustheart 2019-08-23 11:16:05 +08:00
@u823tg 毕竟只是晚上在家学学,写写 helloworld,没有动力……
|
56
u823tg 2019-08-23 11:18:09 +08:00
@augustheart 那怪不得,没动力就别学了,浪费时间学完还忘了, 等你啥时候真的想用 rust 做点东西再学吧
|
57
dog82 2019-08-23 11:20:09 +08:00
GO+mysql,10 万+用户的 App,生产服是阿里云 4 核心 4G 内存单台服务器,这么斋的服务器还没我的手机强劲呢,但是没用户抱怨慢
|
58
flyingghost 2019-08-23 11:39:18 +08:00
@augustheart #44,对你的笑话很感兴趣。还有更多吗?
|
60
augustheart 2019-08-23 12:08:48 +08:00 11
@flyingghost 因为记不清楚了,所以上谷歌搜了一下,全文是这个:
凌晨三点的办公室灯火通明, Ruby 开发者在解决性能问题, Python 开发者在拿游标卡尺量缩进, JavaScript 开发者在 npm 上找包, C 开发者在解决内存泄漏, C++ 开发者在编译, Java 开发者在各种 Factory, Rust 开发者在研究怎么通过编译, Go 开发者正在 if err != nil, 王垠还没选好用什么语言。 |
61
xpresslink 2019-08-23 12:10:23 +08:00
楼主的这例子没有什么说服力。
如果真的是全业务链调用,mongodb 的 IO 绝对占大头,性能极致也是 ms 级别的。 如果性能差出 10 倍来,肯定是以前 node 的代码太菜了。 |
63
lidfather 2019-08-23 12:12:54 +08:00 via Android
各位,性能不重要,不差那一点钱,能产生价值才是正道,不要浪费时间搞什么 cpp rust Haskell,过来人一点建议。
|
64
Raymon111111 2019-08-23 12:17:23 +08:00
crud 主要耗时都在和数据库交互上, 和语言没什么关系
你要不再看看耗时监控? |
65
reus 2019-08-23 12:18:15 +08:00
|
66
no1xsyzy 2019-08-23 12:19:48 +08:00
@augustheart
特例不能用来当正例,但可以用来当反例,黑天鹅只要一只。 不能排除业务本身要求引用计数的情况,比如写解释器。你要决心永不释放堆内存条,学 nginx javascript 运行一次结束直接删实例的,当我没说,这写的状态隔离比 erlang 还强。 |
67
lincanbin 2019-08-23 12:20:45 +08:00 via Android
挺多用 C++的后台开发的,但是开发效率真的不太行。
|
68
StarkWhite 2019-08-23 12:27:24 +08:00
|
69
jevonszmx 2019-08-23 12:27:52 +08:00
@learningman 找汇编人才,比起 java,估计招人效率降低不止 10 倍
|
70
augustheart 2019-08-23 12:30:14 +08:00
@no1xsyzy 精确控制资源本来就是 c 原教旨主义者的正常状态。就这么说吧,敢拿纯 c 写复杂业务还能写好的家伙哪个都不简单。
所以为啥写 c/c++的人越来越少了?还不就是这一堆东西太费脑。 |
71
liuminghao233 2019-08-23 12:35:22 +08:00 via iPhone
你查个库那条 tcp 连接上花的时间
不是语言可以优化的 |
72
augustheart 2019-08-23 12:37:48 +08:00
@u823tg 我学 rust 这回事本身就是不带功利心的学,每次放弃都比以前多了解了点语言特性。所以无所谓啦
|
73
no1xsyzy 2019-08-23 12:42:30 +08:00
@augustheart 按图灵完备的不可静态分析停机肯定存在不用引用计数是无法完成的功能。
构造一个图灵机,模拟一个 C 语言程序并在由输入指定的某一资源被释放时停机。不真正让这个图灵机跑起来是无法判断是否会停机的,所以肯定存在功能需要运行时决定资源的释放。 |
74
mq4079 OP 代码就不 show 了公司的业务,此次测试 node 端跑在 windows 本地,数据库驱动用的 mongoose,c++端跑在 ubuntu 虚拟机里,数据库用 mongo 官方的 mongo c++ drive c++11 版本的驱动,web 框架用的 cinatra,国内 purecpp 社区开源的 web 框架,在浏览器里看每次请求的响应时间就数据库的 io 操作上看,c++就是快 8~10 的样子,如果非要强行说 io 操作时间差不多,那就亲测一下就知道了
|
75
mq4079 OP 另外说一下 node 和 C++我都用,一个快速开发一个性能好,语言没有孰优孰劣,非要争论下去这就不是一个技术问题而是程序员的政治问题了,我发这贴的目的是想了解下 C++写后台的公司多不多
|
76
ClaudeRay 2019-08-23 13:07:26 +08:00
@mq4079 实现和运行环境都差不少,这样得出的数据作为结论不合适吧,单说 mongoose 和 node-mongodb-native 官方驱动的性能差距就非常之大了。
|
77
augustheart 2019-08-23 13:08:35 +08:00
@no1xsyzy 语言需要计数器和使用计数器来管理资源不是一回事吧。咱们好像聊差了,不是一个方向了……
|
78
VDimos 2019-08-23 13:09:15 +08:00 via Android
用 rust 写,用的 rocket,性能屌屌的
|
79
Hanggi 2019-08-23 13:09:32 +08:00
那是因为你试了一下,然后感觉性能好强啊,但是等你到写复杂的功能逻辑的时候你就会知道,node 真香。
C++ 当然也都可以写,但是更好的选择是 Java 或者 Golang。 |
81
flyxl 2019-08-23 13:11:00 +08:00 via Android 1
@mq4079 从浏览器请求响应时间得出数据库 io 效率 10 倍差距,这个结论不专业呀,一个 http 请求经过那么多的处理,比如 json 编解码,比如 http 响应解析,还有业务逻辑处理等等,这中间的任何一步都可能成为性能瓶颈啊
|
82
killerv 2019-08-23 13:12:45 +08:00
@dosmlp 没有业务场景,单纯对比语言的快慢这个测试肯定是差距很大的,但是真正的业务,瓶颈一般都在 io,比如说一次请求,数据库查询耗时 20ms,A 语言处理比 B 语言快 10ns,肯定有提升,但是并不明显。
|
83
augustheart 2019-08-23 13:14:34 +08:00
所以破案了?
|
84
fakeshadow 2019-08-23 13:23:33 +08:00
同推荐楼主试试 rust
|
85
nigelvon 2019-08-23 13:45:44 +08:00
如果不是密集运算型不可能差这么多的,听你的描述仅仅是从 mongodb 获取数据的,别说 10 倍了,我觉得差两倍都不正常。不如把代码贴出来看看。
|
87
no1xsyzy 2019-08-23 14:33:58 +08:00
@augustheart 确实远了,不过如果不把程序员当控制变量而当随机变量的话,其实写出来的代码孰快孰慢还不一定。
我写惯了高级语言的函数式计算结果换 C 写了个非常低效率的算法…… |
88
fox1955 2019-08-23 14:44:24 +08:00
mongoose 构造 schema 对象是耗时操作,破案还需 lz show code.
|
89
spotfg 2019-08-23 14:59:15 +08:00
@flyingghost
凌晨三点的办公室灯火通明, Ruby 开发者在解决性能问题, Python 开发者在拿游标卡尺量缩进, JavaScript 开发者在 npm 上找包, C 开发者在解决内存泄漏, C++ 开发者在编译, Java 开发者在各种 Factory, Rust 开发者在研究怎么通过编译, Go 开发者正在 if err != nil, 原文 |
90
gtlions 2019-08-23 15:03:00 +08:00 via iPhone
|
91
danc 2019-08-23 15:13:51 +08:00
所以嘛,@augustheart 大佬,Rust 究竟是有多难,让你两次入门到放弃。我当初学 Rust 好像挺快的啊。
|
92
ipwx 2019-08-23 15:20:21 +08:00
哎,楼上一堆喷 C++ IO 不行的,怕不是没见过优化到极致的 C++ 程序。
一切别的语言能用的技术,C++ 都能用,只不过要花更多的编码时间罢了。 ==== 而且另一方面,SQL 数据库的瓶颈一般不在客户端的 IO,在于数据库服务器本身。 |
93
augustheart 2019-08-23 15:21:13 +08:00
@danc 我说了啊,没有动力。本来就是玩儿的。
这破库居然要 nightly,mlgb,不玩了。 调个 win api,这么麻烦?滚蛋,直接上 c++ 我以前自己拿 c++写了个简陋的音乐播放器,某晚突然心血来潮想 rust 重写,写了个 winmain,wrnmd,这么啰嗦?不干了…… 然后…… |
94
ipwx 2019-08-23 15:21:49 +08:00
C++ IO,优化到极致,实现方式据我所知就有两种:
1、libevent (epoll)。2、boost::asio。 而后者是 Node.js 回调地狱的 C++ 版。你说,技术手段都一致了,C++ 更快有什么奇怪的。 |
95
blless 2019-08-23 15:23:11 +08:00 via Android
go 我觉得有 c c++60%-80%的性能 甚至还内置了汇编
60%-80%的 python 开发效率,已经很爽了 rust 嘛…看完教程的功夫我得 go web 已经写完了 |
96
augustheart 2019-08-23 15:26:18 +08:00
@ipwx 没人喷 c++的 io 不行吧……
|
97
b00tyhunt3r 2019-08-23 15:55:53 +08:00 via iPhone
@no1xsyzy :
“另外一些 函数式语言也能生成高效的代码,比如 OCaml。在一次程序语言暑期班上,Cornell 的 Robert Constable 教授讲了一个故事,说是他们用 OCaml 重新实现了一个系统,结果发现 OCaml 的实现比原来的 C 语言实现快了 50 倍。经过 C 语言的那个小组对算法多次的优化,OCaml 的版本还是快好几倍。这里的原因其实在于两方面。第一是因为函数式语言把程序员从底层细节中解脱出来,让他们能够迅速的实现和修改自己的想法,所以他们能 够迅速的找到更好的算法。第二是因为 OCaml 有高效的编译器实现,使得它能生成很好的代码。” =========== 这段怎么查不到英文原文 |
98
no1xsyzy 2019-08-23 15:59:43 +08:00
@b00tyhunt3r 因为是中文使用者写的博客,原文又删贴了,地址没存不然还可以去 Web Archive 找到,现在就是找起来有点麻烦
|
99
dosmlp 2019-08-23 16:12:58 +08:00
@ipwx linux 上 epoll 不是极致,dpdk 才是,Windows 的 iocp 也不是极致而是 rio
磁盘 io 一般也会用内存映射避免内核中进行内存拷贝 |
100
b00tyhunt3r 2019-08-23 16:28:18 +08:00 via iPhone
@no1xsyzy
用关键词查谷歌 Cornell Robert Constable Ocaml 也没找到 |