在随播放框架提供的Websocket聊天示例中,在我看来,只创建/使用了一个actor; 它还使用"接收",如果我理解的话,强制演员和线程之间的1:1映射,有效地使这个聊天服务器单线程?
在这里查看代码:https://github.com/playframework/Play20/blob/master/samples/scala/websocket-chat/app/models/ChatRoom.scala
如果这个分析正确吗?如果是,您是否有关于如何使该服务器具有高度可扩展性的指针?
与竞争对手相比,我很自然地被Ember的API /设计/语法所吸引,但看到性能明显变差,我感到非常难过.(例如,请参阅现在众所周知的http://jsfiddle.net/samdelagarza/ntMdB/167/.)我的眼睛告诉我至少比Chrome中的Backbone慢4倍.
EmberJS的0.9.6版本显然有许多性能修复,特别是在绑定和渲染方面.但是,使用此版本的Ember时,上述基准测试仍然表现不佳.
我将上述基准视为一个框架绑定成本的示范.我来自Flex,绑定表现得非常好,你不必经常考虑你想要使用的每个渲染器(乘以20个渲染器)的这5个绑定是不会有太大的开销.易用性很好,但只有保持足够好的性能.(更重要的是,因为HTML5也经常以移动设备为目标).
就目前而言,我倾向于认为Ember的美丽与其竞争对手相比并不值得表现,因为我们在谈论有很多绑定的大型应用程序,否则你首先不需要这样的框架.我可以忍受Ember的表现稍差; 毕竟它带来了更多的东西.
所以我的问题相当笼统和开放:
我正在阅读关于CoffeeScript的文章,我仍然试图定位语言,可以做什么,最佳做法是什么等等; 我更习惯强类型语言(AS3,Java,Scala)所以我的两个问题可能会让你微笑一下:)
问题1:自定义集合
您如何看待定制系列?JS/CS是这方面最弱的语言之一; 例如,没有Array.remove,你必须使用繁琐的splice()方法.一些函数库(如下划线)通过提供将数组/对象作为第一个arg的函数来扩充API,但是给出了我更喜欢的选择:
list fancyFunction 3, 4
Run Code Online (Sandbox Code Playgroud)
而不是
fancyFunction list 3, 4
Run Code Online (Sandbox Code Playgroud)
假设我创建了一个List类; 是否可能,如果是,这个类能够使用CS的理解语法的必要条件是什么?最糟糕的情况是,我猜List可以有一个toArray()方法,而且可以对该返回值执行常规的CS操作,但我希望有更好的解决方案.
理想情况下,我希望能够定义丰富的自定义集合,但不能以失去理解为代价等.
问题2:可变性
人们对CS/JS中的可变性非常小心的感受是什么?
当我在网上阅读各种代码时,我的印象是一切都是可变的,人们通常认为最好不要打扰并减少代码行.
例如,可变与不可变的基本Point类:(希望我没有做错事)
易变的
class Point
constructor: (@x, @y) ->
Run Code Online (Sandbox Code Playgroud)
不可变
class Point
constructor: (x, y) ->
@x = -> x
@y = -> y
Run Code Online (Sandbox Code Playgroud)
没有那么复杂但稍微怪异的语法.另一个考虑因素是JS并不是人类已知的最快的东西,并且为了成为纯粹主义者而不得不在循环中创建大量对象可能会产生反效果,性能明智.我没有对创建新Point对象的成本进行基准测试,而不是改变一个成员.
想象一个大型应用程序,其中有许多模块通过瘦API进行通信.你不想传递不可变对象吗?或者你会执行防御性副本吗?
注意:我并不是想尝试将CS改为我所知道的语言; 相反,我想知道重用其他语言中理所当然的一些概念是否有意义.
谢谢
performance ×2
actor ×1
akka ×1
binding ×1
coffeescript ×1
collections ×1
ember.js ×1
immutability ×1
scala ×1