由于优化性能和完全关闭安全性之间存在巨大差异
通过减少GC的数量,它们的框架可以更快地响应,并且可以(大概)更快地运行。现在,针对垃圾收集器进行优化并不意味着他们从不进行垃圾收集。这只是意味着他们减少了这样做的频率,而当他们这样做时,它的运行速度很快。这些优化包括:
- 通过使用小的可抛弃对象,将移到幸存者空间(即,幸存了至少一个垃圾收集)的对象数量降至最少。移动到幸存者空间的对象更难收集,这里的垃圾收集有时意味着冻结整个JVM。
- 开始时不要分配太多对象。如果您不小心,这可能适得其反,因为年轻一代的对象分配和收集起来非常便宜。
- 确保新对象指向旧对象(而不是相反的对象),以便易于收集年轻对象,因为没有引用它们,这会导致它们被保留
当您调整性能时,通常会调整一些非常特定的“热点”,而忽略不经常运行的代码。如果您使用Java进行此操作,则可以让垃圾收集器仍然照顾那些黑暗的角落(因为这不会造成很大的不同),同时非常仔细地优化在紧密循环中运行的区域。因此,您可以选择优化的地方和没有优化的地方,从而可以将精力集中在重要的方面。
现在,如果您完全关闭垃圾收集,那么您将无法选择。您必须手动处置每个对象。该方法每天最多调用一次?在Java中,您可以接受它,因为它对性能的影响可以忽略不计(每个月可以进行一次完整的GC可以这样做)。在C ++中,您仍然在泄漏资源,因此,即使是那种晦涩的方法,也必须加以注意。因此,您必须在应用程序的每个部分中为资源管理付出代价,而在Java中则可以集中精力。
但情况变得更糟。
如果您有错误,请在仅在星期一满月访问的应用程序的一个暗角里说一个错误怎么办?Java有很强的安全保证。几乎没有“未定义的行为”。如果您使用了错误的东西,则会引发异常,程序停止,并且不会发生数据损坏。因此,您很确定没有您的注意就不会发生任何错误。
但是在类似D的情况下,您可能会遇到错误的指针访问或缓冲区溢出,并且可能破坏内存,但是您的程序将不知道(您已经关闭了安全性,还记得吗?),并且将继续以错误的方式运行数据,然后做一些非常令人讨厌的事情并破坏您的数据,而且您不知道,随着发生更多的破坏,您的数据变得越来越错误,然后突然崩溃,并且它在生命攸关的应用程序中,并且在火箭的计算发生了一些错误,所以这是行不通的,而火箭爆炸,有人模具,而贵公司在所有报纸的头版和你的老板点了手指,你说“你是建议我们使用D来优化性能的工程师,您怎么没想到安全性?“ 这是你的错。你愚蠢地企图杀害那些人。
好吧,好吧,在大多数情况下,它都没有那么戏剧性。但是,即使是关键业务应用程序或GPS应用程序,或者说政府医疗保健网站,如果出现错误,也会产生一些非常负面的后果。使用一种可以完全防止它们发生或在发生它们时快速失败的语言通常是一个好主意。
关闭安全性是有代价的。本地化并不总是有意义。有时候,只优化一种安全的语言,使之成为一种可以让您大声疾呼自己的语言,会更加简单和安全。在很多情况下,正确性和安全性要比完全消除GC所浪费的几纳秒要好。干扰器可以在那些情况下使用,所以我认为LMAX交换做出了正确的电话。
但是,D呢?如果确实需要黑角,则可以使用GC,并且SafeD子集(在编辑之前我还不知道)可以删除未定义的行为(如果您记得使用过的话!)。
那么在这种情况下,这是一个简单的成熟问题。Java生态系统充满了编写良好的工具和成熟的库(更好的开发方式)。与D(更好的维护)相比,了解Java的开发人员要多得多。对于像金融应用程序这样重要的事情,使用一种新的但不太流行的语言并不是一个好主意。使用不太知名的语言,如果您遇到问题,几乎没有什么可以帮助您的,而且您发现的库往往会有更多的错误,因为它们所涉及的对象较少。
因此,我的最后一点仍然成立:如果要避免带来可怕后果的问题,请坚持安全的选择。在D生命的这一刻,它的客户是准备冒险的小创业公司。如果问题可能造成数百万美元的损失,那么您最好走在创新钟声曲线上。