〜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?