事件驱动应用 - 选择哪种语言或 VM?[已结束]

Eventdriven app - what language or VM to choose? [closed]

提问人:Ariejan 提问时间:11/1/2010 更新时间:10/4/2012 访问量:458

问:

我正在考虑编写一个具有以下要求的应用程序。我精通 Ruby,但我愿意学习一门新语言,比如 Scala、Clojure 或 Python。

并发性/最佳性能

这是我的主要目标。它需要非常快,并以体面的方式支持并发。

使用 Redis 作为后端

这不会是一个大问题,redis 有广泛的驱动程序可用,但它可能会影响语言/平台的最终决定。

Websockets 支持

对 websockets 的良好支持是必须的。使用附加库(如 Ruby::EM 的 Cramp)是可以的。

选项

我收集了以下选项:

  • Ruby 事件机器
  • 蟒蛇扭曲
  • 节点 .js
  • Clojure
  • 斯卡拉
  • 爪哇岛

目前,编写原始 C 或汇编程序不是可行的选择。

并发

Ruby 1.9 仍然使用 GIL,因为所有基于 JVM 的解决方案都可以使用原生线程。在这种情况下,我不确定 Node.js。

所选语言对性能有何影响?

问题

你有什么建议,为什么?你有实践经验吗?请启发我(以及 StackOverflow 的其余部分)

Ruby 编程语言 并发 clojure 节点 .js

评论


答:

5赞 Will 11/1/2010 #1

Clojure 的速度大约是 node.js 的两倍,比 Python 快三倍,Python 被认为比 ruby 快。

评论

1赞 sblom 11/1/2010
谨防诸如此类的粗略概括。这些不同平台的真实比较性能在很大程度上取决于工作负载。
0赞 nickik 11/1/2010
同意,但 aleph 是一个非常酷的项目,即使它的速度不是 2-3 倍,也应该看看。
1赞 Will 11/2/2010
我必须说,我发现这些概括通常是准确的,并且我玩过 JVM 和 Python Tornado 和 Twisted
3赞 william gouvea 11/1/2010 #2

在 Clojure 上,你可以使用 Grizzly 进行异步 http 处理和基于 comet/websockets 的应用程序。 Redis 是缓存和创建内置发布/订阅协议的强大分布式会话的绝佳选择 另一件大事是使用 RabbitMQZeroMQ 来模拟基于代理的分布式系统,并提供例如组、数据或集成服务。

2赞 william gouvea 11/1/2010 #3

是相对的......非常喜欢 clojure,并且部分同意你的看法,其中 clojure 是 JVM 上最快的语言之一。

但是语言知识是必不可少的,可以证实我们的感受。

关于基准测试、性能和比较的一些有趣的链接:

http://bit.ly/dtqHAG

“过早的优化是万恶之源”,唐纳德·克努斯 (Donald Knuth)

评论

0赞 mikera 4/24/2012
Clojure 可能是 JVM 上最快的动态语言。它还没有完全赶上像Java或Scala这样的静态编译语言,尽管它最终可能会到达那里(考虑到类型推理方面的一些创新)
3赞 mikera 11/1/2010 #4

如果高性能并发是你的主要标准,我会投票给 Clojure。Clojure 从一开始就基本上是为并发开发而设计的,并且已经有一些令人印象深刻的 Clojure 演示运行在 800+ 核心的 Azul 盒子上。

非常值得一看这个视频演示,以了解 Clojure 的并发方法:

http://www.infoq.com/presentations/Are-We-There-Yet-Rich-Hickey

Clojure 并发性能的主要技巧是软件事务内存 (STM) 的巧妙实现,它允许您执行许多并发事务,而无需复杂且昂贵的锁定方案。它还使用持久数据结构来提供对多个版本数据的不变性和高效管理。这很酷。

至于通用性能,Clojure 已经非常快了,而且随着新的 1.3 alpha 分支的推出,速度甚至更快。Rich Hickey(Clojure 的创建者)的一个既定目标是让你在 Clojure 中以与纯 Java 相同的速度做任何事情。

Clojure 中我非常喜欢但可能与您相关,也可能与您无关的其他内容:

  • 非常强大的LISP风格的宏系统 - “代码就是数据”,你可以这样操作它
  • 它是一种成熟的函数式语言
  • 默认情况下,它是动态类型的(为了灵活性和快速原型设计),但如果需要,您可以添加静态类型提示(以获得更好的性能)
  • 出色的 JVM/Java 集成,因此您可以利用所有优秀的 Java 库和工具(例如,用于事件驱动服务器通信的 Netty