〜1秒延迟控制应用程序:这适合Java吗?
在我的工作中,我们最近完成了控制应用程序的系统架构,该控制应用程序的最大延迟时间大约为一到两秒。 它分布在通过IP LAN进行通信的小型ARM片上盒上。
我们最初预见到我们会使用C或C ++,因为它是一种经典的控制系统语言。 在讨论了如何实现应用程序之后,我们现在认识到,C ++库的数量非常有限,缺乏内省,并且还有一些可能会减慢开发速度的属性。 然后我的同事建议说Java可能会胜任这项工作。
我真的很担心为控制应用程序运行GC的延迟,而且我也不愿意放弃RAII,因为应用程序将使用大量外部资源(套接字,文件句柄,来自外部库的句柄等)。
pro / con列表目前如下:
C++
+ RAII - Easy resource management - it will be a complex system
+ System language - speed if we cant't find a JIT VM for our ARM
+ No GC - no big worst case latencies from the GC
+ Easy to integrate with some shared mem libs that we have to interface with
- Fewer free as in beer libs
- Lacks introspection - Mapping classes to DB and external data formats (XML)
would benefit from this (ORM /JAXB) approach
- Easy to shoot one self in the foot - hard and expensive to find programmers
which don't make big mistakes
- Memory fragmentation - needs tuning and workarounds
Java
+ Huge amount of libs
+ Introspection - serialization becomes a breeze (see C++ section)
+ Easier to find 'good enough' programmers
- No RAII - Client has to remember finally or you leak
resources. IMO Java programmers tend to ignore this
problem unless they have server app background.
- No System Language - possibly slower although ARMj could alleviate this
- GC - latency might go up (don't know if parallel GC will work - seems that
you might get fragmentation, see note below).
- Need to write JNI for the shared mem libs that we interface with
- Maybe ORACLE will eat us
这篇AMD文章提到了并行GC的内存碎片
如果GC延迟不是问题,我很乐意使用Java,我们可以得到RAII。 因此,我还研究了其他具有RAII的lang,并且可以作为很好的选择,到目前为止,我发现D,Ada,VB,Perl,Python(C),PHP,tcl和Lua似乎有某种类型超出范围的回调。 我对D,Python和ADA可能适合用于控制应用程序的那种赞许性反应。 D和ADA是我的最爱。
所以,我的问题是:你有什么建议吗? Java是一个可行的选择,如果你可以选择任何语言,它会是什么?
GC仅用于从丢弃的对象中回收内存。 丢弃很少的资源,你会得到很少,更短的GC。
你可能会使用大量的套接字,文件句柄,来自外部库的句柄,但是你放弃它们的速度有多快?
完整的GC旨在消除碎片。 它通过复制所有内存来实现这一点,以便连续使用它。 这就是为什么它很昂贵,所以如果延迟对你很重要,你想尽量减少这些。 也就是说,如果您的完整GC需要超过100毫秒,则会出现严重的性能问题。 它不应该那么高。
恕我直言,我简短你应该能够开发一个控制系统的延迟时间远远低于10毫秒,99%+的时间。
在这样的环境中,我会远离GC(当然,就像我见过的任何JVM所实现的那样)。 你将永远在你的头上撞墙问题。
然而,我只想指出,RAII的论点似乎很薄弱 - 您需要进行代码审查和其他此类培训,以确保您的团队能够很好地理解这些问题。 排除一种合适的语言是一个非常糟糕的理由,因为每种语言都有一个缺乏经验/不及时的程序员可能会错过的问题。
我从你的列表中感受到,你错过了C#(我正在想着Mono),当你需要它的时候,你有更多的控制权。 我不知道它是否适合你的环境,但是如果你在你的洗衣清单上列出了VB,这是一个明显的疏漏。
链接地址: http://www.djcxy.com/p/46133.html上一篇: ~1s latency control app: is this suitable for Java?
下一篇: How can I create a SerialPort mock using the Moq library?