gpt4 book ai didi

java - 与 Java 相比,C++ move 语义性能

转载 作者:行者123 更新时间:2023-12-01 14:06:14 25 4
gpt4 key购买 nike

我想证明使用 move 语义的 C++ 比 Java 快得多,但我惊讶地发现它实际上慢得多。

编辑:我故意在 vector 中插入元素,尽管我知道这样的插入更适合列表。然而,这是在 C++ 中对 move 语义进行基准测试的典型基准。因此,我想使用这个特定的测试来查看与 Java 的差异。

我可能犯了一个错误:我所做的是以下两个程序:
http://melpon.org/wandbox/permlink/abZlAmZrOC9fJV8r

http://melpon.org/wandbox/permlink/3QGQMEIoF5kc3xtY

结果非常令人惊讶,因为它表明 Java 的速度快了 6 倍!
我认为代码可能会在不同的机器上运行,因此我在我的机器上尝试使用 msvc 2012x64 和以下编译选项:

cl /EHsc /Ox cppPerf.cpp



相比

jdk1.8.0_73\bin\javac.exe javaPerf.java



结果给出了支持 java 的比率为 10 !

java怎么会比使用 move 语义的C++快得多?

另一个有趣的一点是,使用 Java7 的性能与 Java8 相差甚远,但仍优于 C++:
http://melpon.org/wandbox/permlink/CJXwHCwp5rGwr1Gc

编辑:我删除了可通过链接访问的代码。

编辑:

我想我发现了问题,Java 优化了一些代码。这些是更新的版本,表明 C++ 的速度要快得多:
http://melpon.org/wandbox/permlink/GsflztloK7ir2jea
http://melpon.org/wandbox/permlink/CLwKoZzbfqstDOfn

编辑:
这是另一个测试,它使用@dasblinkenlight 建议的引用为 C++ 提供基准,它显示了 C++ 和 Java 之间的巨大差异(注意我确实注意到使用 unique_ptr 因为我想检查 C++03 并且我想避免 boost 因此没有 scoped_ptr任何一个):
http://melpon.org/wandbox/permlink/bYQjNpjsIZu3vp3f

结果是:
C++14:
USE_MOVE USE_REFERENCES TIME
Y Y 30 to 55ms
N Y 30 to 60ms

Y N 370 to 210ms
N N 390 to 270ms (Implicit move of elements in vectors)

C++03:
USE_REFERENCES TIME
Y 45 to 70ms
N 1370 to 1650ms (No implicit move of elements in vectors)

Java:
11300 to 13000 ms

最佳答案

问题是你不是在比较苹果和苹果:

  • Java的String s 是不可变的,因此将它们复制到容器中相当于存储引用。
  • 更重要的是,您的代码在 vector 的开头插入,因此 vector 最终执行 O(n2) 复制操作。

  • 我认为第二点是差异的主要原因。最后插入 vec.insert(vec.end(), std::move(myString))或与 push_back并且 Java 的相应变化应该使时间彼此更接近。

    为了解决第一点,动态分配你的字符串,并制作 std::unique_ptr<std::string> 的 vector 。反而。这将复制指针而不是复制内容,从而使性能时间彼此更接近。

    关于java - 与 Java 相比,C++ move 语义性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37676296/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com