为什么这一段同样逻辑的代码,在leetcode上运行,java运行比C++运行快十倍?

题目是leetcode1773题,在看题解时发现的问题。同样逻辑的代码,C++运行计时80ms+,java运行只有6ms+。(初步判断可能是strin…
关注者
53
被浏览
58,520

16 个回答

反对关于 operator== 的那个回答。其一是 LeetCode 用的是 gcc 及其配套的 libstdc++ ,源码完全公开。其二后述。

LeetCode 对 C++ 计时很令我头疼。它计算的时间包含 IO 、参数的初始化之类的。

@冒泡 的观察应该是对的。我把 string 参数改成 const string& 、再于全局变量初始化进行 ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); 后可以跑得明显快一些。

我用 std::chrono::system_clock::now 测试后,得出用题主代码, C++ 上这题最大数据在函数内跑的时间少于 0.2ms 。而测试例有 92 个,从而可以得出主要耗时显然不在提交代码的函数体内。


更新:

现在引用出来的部分是不准确的。测试后发现这题输入规模不太大,传参开销也不算多,无论是否做这些改动跑的时间都可以落在 56ms~80ms 内,明显是测试机器带来非常大的偏差。

刚才我用了全局变量计时。按题主 C++ 代码,在跑全部测试点后,在函数体内跑的总时间在 1ms 上下浮动。(虽然没有测试 Java 的情况,不过我按经验推测大概是在 2ms 以下。)从而可以更加确定对于本题主要耗时不在提交代码的函数体内。

输入参数的两个string类型改成引用看看,其他没发现可疑的地方