|
很多项目的技术负责人喜欢上c++,尤其是游戏项目的服务器端,c++的使用面积很广。
游戏服务器使用c++的原因在于游戏对于服务器性能和实时性要求的很苛刻,比如王者荣耀、英雄联盟之类的moba游戏,在战斗的过程中单局内所有玩家的状态需要实时同步给其他玩家,也就是所谓的帧同步。同步对游戏服务器要求很高,除开网络因素,服务器本身不能有延时,如果在同步数据的过程中服务器卡一下,即使只有短短的数十毫秒,也会影响玩家的游戏体验。因为这种特性,使得java之类的自动内存管理语言无法胜任,因为java虚拟机以及其他虚拟机语言比如.net,在垃圾收集的时候不可避免的会出现停顿,也就是stop the world,停顿时间可以是几十毫秒,也 可以是几秒,这对实时性要求极高的同步场景显然不适用,所以必然要上c/c++之类的手动内存管理语言,避免停顿造成的卡顿。
然而,也不是所有游戏都有实时同步场景的,比如卡牌游戏对实时性的要求就不高,所以就不是必须要使用c++, 甚至于对实时要求很高的moba游戏,除开战斗部分要使用c++,其他各类系统也可以用更加先进的虚拟机语言开发,如java,因为一个游戏服务器肯定要做成集群,不同的服务节点可以用不同的语言开发,并没有什么技术障碍。
为什么除了同步之外的场景要用c++之外的语言开发呢?因为c++对开发者实在太不友好了,这种不友好在开发的各个阶段都存在。
比如在项目中使用一个第三方的库,需要下载源代码,自己编译,而且编译也不会一帆风顺,有很大的几率会编译通不过,然后做各种调整,再编译,甚至反复这个过程。而且一般还需要编译windows、linux两个系统的版本。好不容易编译通过了,要是不走运,在引用的时候还会出现各种符号冲突问题,然后你又要找出原因所在调整后重新编译,总之c++使用第三方库是一个让人抓狂的过程。
其次,c++的编译速度太慢,假如一个项目的开发周期是一年,用c++花在编译上浪费的时候都要比能快速编译的虚拟机语言多好几天。
当然这些还不是最主要的,在这些障碍上多花的时候总有限制的,项目周期延长十天半个月也不是大不了的事。最关键的是写c++代码太容易出错。
c++,一把使用超级复杂的武器,用不好自己会被伤到
用java写代码,只要不做大死,比如使用数据库后不关闭连接造成资源耗尽,或者往一个静态变量里无限写入数据造成内存泄露等等骚操作之外,程序在运行过程中不太会出现意外, 说白了就是比较安全,比较耐操,随你怎么搞。但是c++就不一样了,如果你没有释放某快动态分配的内存,或者返回了某个局部变量的引用,那程序就会毫不给面子的爆掉,或者神经病发作,而且程序员还找不到原因。
这就导致了一个现象,要写出可靠的c++程序,程序员的水准必须要很高,比要写出相同可靠性java程序的java程序员高出一大截,所以招聘c++程序员要求普遍要比招聘java程序员要高。但是高水平程序员总是稀缺的,因此为了安全起见,不是必要使用c++的场景建议使用java或者其他同类语言。
虽然c++的性能更好,主要体现在节省内存上面,因为c++对于数据结构的组织很纯粹,数据就是数据,不夹杂多余的事物,而java之类的语言因为要支持动态管理内存,所以对象上面会带很多垃圾收集的信息,比如分代年龄、锁状态、hashcode等等,甚至于这些对象的头信息比数据本身的体积还要大,因此大家普遍知道java比c++更消耗资源。
但是现在服务器硬件成本越来越低,程序的稳定性、开发周期、人力成本对公司而言是更重的成本,因此对公司而言,用java比用c++更具性价比,c++的性能优势已经不足以作为战胜java的武器,这也是在互联网领域份额上,java总是压c++一头的原因。
但是有的技术负责人却不管这么多,他们自己擅长c++,可以写出健壮的c++代码,所以他们很有把握的给新项目上c++, 但是他们的小弟却不一定有这个能力写好c++,当项目规模扩大了,他们不可能一个人写完所有代码,也不可能仔细检查所有的小弟们写的代码,这就造成了项目bug百出、开发周期延长,即使上线了也是频繁的出现生产环境事故。
曾经经历过一个项目,项目后端负责人以性能优势为理由采用c++开发服务器,但是公司在招聘上又不花重金聘请资深c++程序员,只找一些实习生或者经验尚浅的c++程序员,结果整个项目的服务器端做的千疮百孔,数之不尽的bug永远改不玩,整个项目其他方面都已经就绪就差服务器迟迟跟不上进度。后来迫于压力强行上线运营,不出意料服务器线上事故频繁,公司损失惨重。要知道推广一个项目所花费的广告费用非常巨大,但花了很大的代价把用户买过来,可生产环境三天两头出事故,这对用户的伤害很大,用户不爽拍拍屁股走人,公司的推广费用就打了水漂。为此老板天天开会骂人,但是又能如何,当一个项目成千上万的功能堆积成型后,要改善其中问题绝非一朝一夕能完成,如果换人则问题会更加严重,新来的人不熟悉业务逻辑和前人挖的坑,更容易触发未知的机关,所以整个公司都无可奈何,最终巨资开发的项目也惨淡收场。
现在明事理的程序员基本都有这样一个共识:c++和java都能干的事情就一定要用java,否则才用c++,遵循这个原则去做技术选型,绝不会错。 |
|