战魂小筑

讨论群:309800774 知乎关注:http://zhihu.com/people/sunicdavy 开源项目:https://github.com/davyxu

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  257 随笔 :: 0 文章 :: 506 评论 :: 0 Trackbacks

以下比较的基础都是基于一种编程语言+一定的第三方或者自己编写的网络库和底层进行的,Skynet稍微特殊,但总体比较合适放到比较中来

C#

开发效率:Windows下可以通过VisualStudio进行开发,其他平台可以使用MonoDevelop,非常方便

运行效率:JIT的性能优化比较到位,能适应90%性能环境

部署便捷性:可以通过交叉编译生成其他平台的可执行文件,通过mono运行可执行文件

调试便捷性:VisualStudio和MonoDevelop调试均很方便, 还可远程调试

上手度:对C系语言熟悉的几天就可上手

热更新:可以通过DLL方式进行

Web对接:可做,代码比较啰嗦

崩溃处理:可通过try catch捕获错误

网络库编写难度:一般,需注意gc问题

第三方网络库及框架数量:一般

 

Golang

开发效率:高

运行效率:并发上非常有优势,对CPU利用率比较高,原生运行无虚拟机

部署便捷性:一次编译到处运行,无任何运行库依赖

调试便捷性:实际操作中,单线程挂接调试器可行, 但变量显示不正确,开发期基本采用日志方式进行查错

上手度:语言简单,特性少, 新手1周能贡献代码

热更新:无法进行热更新,语言无法编译为DLL,也不支持DLL加载(linux平台的.so加载忽略不计)

Web对接:非常方便, 代码精简

崩溃处理:崩溃后以命令行方式打印出栈,程序内可以捕获任何崩溃错误并继续运行

网络库编写难度:简单,比C socket更简单

第三方网络库及框架数量:偏少

 

Skynet(lua+C)

开发效率:基于动态语言的开发初次写比较快,后期维护和重构会耗费一定的时间在查错上

运行效率:基于lua jit的运行效率还是能接受的

部署便捷性:方便, 只有底层修改需要重新编译, 大部分时间只用更新lua文件

调试便捷性:不是很方便,基于日志方式进行查错

上手度:lua语言特性有部分和C系语言有一定差异,基于Actor模型的思想学习,适应需要耗费一定的时间

热更新:类似于Erlang,可精确到函数级的热更新

Web对接:有一些http支持,通过社区慢慢进行完善

崩溃处理:lua天生可以捕获错误

网络库编写难度:自带,无需编写

第三方网络库及框架数量:通过社区慢慢完善

 

C++

开发效率:编译慢,文件多,通用库少

运行效率:native速度标杆

部署便捷性:编写各类的make门槛较高

调试便捷性:可通过VisualStudio进行Windows平台调试

上手度:2~3年经验的熟手仍然会写出崩溃和泄露代码

热更新:可通过DLL进行

Web对接:代码啰嗦,第三方库少

崩溃处理:Windows下可使用SEH捕获段异常,其他平台只能通过崩溃后进行coredump分析,容错非常差

网络库编写难度:基于asio编写较为简单,但总体看来难度不低

第三方网络库及框架数量:较多

 

以下是得分

image

 

从发文时的项目对这些语言使用率来说,Java,Erlang,C++编写的服务器较多,Golang,JavaScript,C#是第二梯队,Skynet由于上手不是很容易,所以仅有两位数的团队在使用,但总体表现还是比较出色的

对于老团队, C++的服务器工具链和框架已经相对成熟, 完全没必要更换新语言, 只是在对接sdk感觉困难时,可以尝试Golang这些对web有优势的语言进行混合语言开发

对于新团队,开发效率,上手度和部署效率是优先选择的,C#,Golang,JavaScript这些新兴语言会让你事半功倍

对于大规模无需选服的服务器, Skynet的actor模型对扩展会比较容易

对于大公司,好项目,上线后需要通过热更新进行bug修补的,C#,C++,Erlang会是首选

 

但总的一点, 还是根据团队熟悉度来选择语言,贸然的使用新语言的风险也是很大的

posted on 2016-01-05 16:51 战魂小筑 阅读(18876) 评论(10)  编辑 收藏 引用 所属分类: 网络 服务器技术C++/ 编程语言Golang

评论

# re: 服务器开发语言比较 2016-01-20 17:55 路人
c#做游戏服务端, 配合unity3d简直完美  回复  更多评论
  

# re: 服务器开发语言比较[未登录] 2016-05-05 15:42 shine
居然没有Java  回复  更多评论
  

# re: 服务器开发语言比较 2016-05-05 16:33 战魂小筑
@shine
哈哈哈, 被你发现了, 因为我这边不用Java
Java的分至少也和C#相当  回复  更多评论
  

# re: 服务器开发语言比较 2016-05-10 02:56 SuperSoar
C# 部署麻烦。
另外 话说最近才发现 go语言真是相当不错了。
go不是vm语言。
其次 go语言的网络开发确实方便到爆 C#相与之比较还是 逊色很多。

C#这个语言真是即严谨又啰嗦。
  回复  更多评论
  

# re: 服务器开发语言比较 2016-05-10 09:08 战魂小筑

@SuperSoar
部署麻烦点, 但语言和开发环境是go的软肋, C#太方便了  回复  更多评论
  

# re: 服务器开发语言比较 2016-06-15 21:58 witch
我们团队就犯了贸然更换语言的错误,导致现在后悔的不得了。

golang现在用下来,遇到几个麻烦的坑。
1. 调试不能用断点。我们使用新版的idea来开发golang程序,但断点经常失败。而lite好多人用不习惯。
2. 第三方库偏少,但最重要的是很多都没有tag或版本,根本不知道获取下来的是开发版本还是稳定版本,甚至不知道api有哪些改动。有时候需要获取一个早期版本时不得不从git的log中仔细找。
3. 没有热更新,上线后出了问题不好处理。
4. 没有泛型。
5. 指针类型和值类型之间更偏向于值类型的设计对非C++出身的程序员还是容易犯错。
6. 切片有坑!
7. 语法存在一种表述多种含义的模糊性。导致第一眼看代码时容易看不懂,必须结合上下文来仔细理解。
  回复  更多评论
  

# re: 服务器开发语言比较 2016-06-15 22:28 战魂小筑
@witch
1. 调试不能用断点。我们使用新版的idea来开发golang程序,但断点经常失败。而lite好多人用不习惯。
调试不用断点是一种基本素质, 要求代码有一定可分析基础, 习惯就好

2. 第三方库偏少,但最重要的是很多都没有tag或版本,根本不知道获取下来的是开发版本还是稳定版本,甚至不知道api有哪些改动。有时候需要获取一个早期版本时不得不从git的log中仔细找。

写游戏服务器不存在用第三方库, 我们最多用到mongodb, mysql等的第三方库. 当时也出现过选择问题, 但最终还是选到合适的了

3. 没有热更新,上线后出了问题不好处理。
这个就是和运营运维的配合, 如果服务器连停下来更新都不允许, 这个也太过了

4. 没有泛型。
这是个问题, 后期应该会有所改善

5. 指针类型和值类型之间更偏向于值类型的设计对非C++出身的程序员还是容易犯错。
请更多的使用指针类型

6. 切片有坑!
比起指针来说, 切片的坑算少的了

7. 语法存在一种表述多种含义的模糊性。导致第一眼看代码时容易看不懂,必须结合上下文来仔细理解。

这是你们编写问题吧, 我们基本上拿到任何人代码都能马上看得懂

  回复  更多评论
  

# re: 服务器开发语言比较 2016-06-16 00:28 witch
@战魂小筑
1. 希望delve早日完善了。

2. 这个是吐槽下protobuf库。redigo和gorm也有这个问题。希望官方能早日统一下库发布时的版本规则吧,毕竟优秀的第三方库可以提升项目的实现难度和维护性。

3. 热更新对于使用长连接的游戏服务器来说真的是个巨大的加分点。
开服第一天就停服维护会让在线掉很多,不利于数据的采集,也打击运营的信心。服务器铺开来后,为了一个bug而大面积停服也是挺头大的。特别是对于游戏这类开发节奏很紧业务很复杂很容易出bug的项目。

4. 希望版本2赶紧出来。

6. 指针不能参与运算感觉已经比C、C++好很多了。求教指针相关的坑?

7. 这个是我表述错误了。应该是go的嵌入类型特性以及非常自由的接口机制导致不太容易找到接口的实现,也不容易注意到是否误实现了某个接口。
  回复  更多评论
  

# re: 服务器开发语言比较 2016-06-29 05:16 SuperSoar
@战魂小筑
是的 LiteIde 这种虽然勉强能用,但是相比VS 还是相差得太远太远了...
  回复  更多评论
  

# re: 服务器开发语言比较[未登录] 2016-06-29 17:18 eric
java和erlang不用吗  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理