跳转到主要内容
Chinese, Simplified

你好。 起初,我是一名 Rust 程序员,并为它编写了一些项目和一个框架,在听说动态编译技术后,JVM 对我很有吸引力,我在 rust 中编写了一个带有许多优化标志的程序,以便编译器获得最佳性能 ,并在java中编写实例。
经过热身时间后,我看到了 JVM 的惊人性能,它是一头野兽,可以在性能上击败 Rust,


Rust result: 10,648 _ 6,678 _ 8,274
Java result: 8,661 _ 9,608 _ 6,302


12次基准的平均值:

Rust: 9,948
Java: 8,693


Java 代码:

 

public static void main(String[] args) {
        for (int q = 0; q < 1001; q++) {
            long tInit = System.nanoTime();

            ArrayList<CClass> arr = new ArrayList<CClass>(100);
            for (int i = 0; i < 100 ; i++) {
                arr.add(new CClass("fname", "lname", i % 30));
            }

            for (int i = 0; i < 100 ; i++) {
                CClass cls = arr.get(i);
                cls.validation();
            }

            if (q > 997) {
                System.out.println(System.nanoTime() - tInit);
            }
        }

    }

Rust Code :

fn main() {

    for _ in 0..3 {
        let now = std::time::Instant::now();
        // ===============================================
        
        let mut v = Vec::with_capacity(100);
        for i in 0..100 {
            v.push(Class::new("fname", "fname", i % 30));
        }

        for i in 0..100 {
            let cls = v.get(i).unwrap();
            cls.validation();
        }

        // ===============================================
        let now2 = std::time::Instant::now();
        println!("==> {}", now2.duration_since(now).as_nanos());
    }
}

我使用一些 rust 编译器标志来最大化性能:

 

[build]
rustflags=[“-C”, “target-cpu=native”]
[profile.dev]
lto = true
opt-level = 3

最后,我越来越喜欢 JVM,java/Scala
伟大的语言,庞大的生态系统和惊人的性能,
阿里巴巴、Linkedin、Twitter、亚马逊使用 80% 的后端工作在 JVM 上,
这不仅仅是为了 JVM 的独立性或生产力
它具有惊人的性能和惊人的稳定性

 

精彩评论1

Java(和 JVM)一点也不慢。 不知道是什么给了你这样的印象。
例如,现代 JavaScript 引擎和现代 JVM 一样快。
当您只对非常简单的循环代码进行计时时尤其如此,这些代码大多会生成相同的程序集。 而且,正如一条评论所说,您可以通过迭代器优化 Rust 的边界检查,这应该会使其更快。
抱怨 Java 和 JavaScript 等不是因为它们很慢,而是因为 GC(垃圾收集)而_偶尔_慢。 并且需要占用大量运行时间(因此需要大量 RAM)。
在您的示例中,您既不会使用大量内存,也不会导致任何 GC。 因此,我希望 Java 速度与 Rust 速度相似,因为没有理由不应该这样。

 

评论2

当您比较不同的分配器时有点不公平。 Java 预先分配内存并为每个分配请求移动一个指针,rust 实际上向系统分配器请求内存。 这是托管 Vs 本机语言的一个已知位,它与 c# 和 c++ 或其他任何语言相同。 如果将分配移到时区之外会发生什么?

评论3

jvm 通过分析程序和找出热路径来调整优化。 一个公平的比较将根据性能配置文件对 rust 程序进行分析和重新优化

评论4

Java 性能的主要问题是它的 GC,它会增加延迟,最重要的是会使请求处理的延迟变得难以预测。 内存管理的可预测性是没有 GC 的语言的优势之一。 当然,我过于简单化了,因为性能是一个相当复杂的领域

评论5

是的,谢谢,我们可以运行一个 10K rps 的 java 服务器,内存使用率很高
但实际上与 Rust Instance 的区别是,Java 使用 2GB,Rust 使用 10MB。
是的 GC 是数据库软件的问题,但不是没有 ZGC 的 Web 服务器,
但是云托管服务器2GB的钱不算什么
但是时间很昂贵,而且经过良好测试的库更重要,
例如 Akka-grpc 在多核服务器上比 Rust-Tonic 更快
因为库经过了很好的测试,但在 Rust 社区中不存在某些东西,例如我们社区中有 Sqlx (Async orm) 和 Diesel(Sync orm) 是关于哪个更好的战争!!。
不存在直接的解决方案 这个问题也存在于 cassandra 驱动程序中,并且文档是旧的并且与新版本不同。
这对我来说很痛苦。
但是在 jvm 中几乎所有东西都直接存在

评论6

这是正确的。 如果您的环境可以使用 2GB 的内存并且 Java 的 GC 对您来说不是问题,那么您应该使用适合您的目的的最佳技术。
对于某些人来说,例如在嵌入式环境中,您没有使用 2GB 的奢侈,并且您无法维持 GC 暂停,那么您可能会选择 Rust。

原文:https://towardsdev.com/java-is-faster-than-optimize-rust-program-bd0d17…

本文:

 

Article

微信

知识星球

微信公众号

视频号