在上一篇文章中,我描述了如何将25k行C#转换为Java以及从该练习中学到的教训。
我收到以下问题:
顺便说一句很棒的文章。 迁移代码后,性能与C#版本相比如何?
改写系统的动机之一是使系统变得更快,而实际上这一目标得以实现。 我们设法将硬件数量减少了5倍,同时仍将系统的吞吐量提高了6倍。这给客户带来了很多好处。
最初的假设是C#实际上并不比Java慢,并且我们必须实现一些高级技术才能获得显着的性能提升。 发生这种情况时,只需重新编写系统即可获得收益。
那么C#比Java慢吗? 一言以蔽之。 虽然我没有在可比较的硬件上运行任何正式的基准测试,但我的轶事证据是,在类似情况下,性能是可比的。 但是我发现确实很容易在C#中围绕数据访问构建一个错误的系统。
C#和SqlServer之间存在极其紧密的联系。 Visual Studio实际上是两者的前端。 有趣的是,我遇到的C#开发人员与SQLServer一样精通C#。 毕竟,几乎所有系统都需要处理存储在数据库中的数据,这听起来不错,因此两者之间的紧密集成应该是可行的方法。 好,是的,不是。 拥有出色的工具和技能以使您能够访问和操纵数据真是太好了,但绝不能忘记“数据聊天”的性能成本。
我正在使用的系统的主要问题是数据访问已紧密集成到代码中。 每当需要一条数据时,都会对数据库进行调用。 实际上,在某些情况下,可以在代码中执行的逻辑是在SQLServer的存储过程中执行的。 只要计算出结果,就将其写回到数据库中。 不仅效率极低,而且使系统更难以理解。
我们要做的第一件事是在数据和代码之间建立清晰的分隔。 使用bcp从数据库中批量导出了程序运行所需的所有数据,这些文件用于创建保存在程序存储器中的对象。 一旦计算出所有结果,它们就会被写入文件,然后bcp备份到数据库中。 这消除了程序与服务器之间不断的“闲聊”,并大大加快了系统速度。 这也使系统的输入和输出非常透明。 将数据库调用掩埋在代码中会使输入和输出变得相当不透明。
因为我们使用的是Java,并且无法访问与SQLServer的紧密耦合,所以我们被迫遵循一项重要的良好实践,即“从处理过程中分离数据”。 这是实现性能改进的关键。
所有这些都不表示C#,SQLServer和Visual Studio之间的集成是一件坏事。 实际上,恰恰相反,它是一个非常强大的工具,如果不加理解和小心处理,与所有强大工具一样,这将是危险的。
翻译自: https://www.javacodegeeks.com/2015/05/c-vs-java-which-one-is-faster-translating-25k-c-into-java-2.html