【发布时间】:2019-05-19 16:38:08
【问题描述】:
我用 C++ 和 Java 编写了相同的程序。对于 C++,我使用 VS 2019,对于 Java,我使用 Eclipse 2019-03。
这是 C++ 程序。
#define InputSize 500000
int FindDuplicate::FindDuplicateNaive(int* input, int size)
{
int j;
for (int i = 0; i < size-1; i++)
{
for ( j= i+1; j < size; j++)
{
if (input[i] == input[j])
return input[i];
}
}
return -1;
}
int* FindDuplicate::CreateTestCase(int size)
{
int* output = new int[size];
int i;
for ( i= 0; i < size-1; i++)
{
output[i] = i + 1;
}
output[i] = i;
return output;
}
int main()
{
int* input= FindDuplicate::CreateTestCase(InputSize);
auto start = std::chrono::system_clock::now();//clock start
int output = FindDuplicate::FindDuplicateNaive(input, InputSize);
auto end = std::chrono::system_clock::now();//clock end
cout<<"Output is: "<<output<<endl;
std::chrono::duration<double> elapsed_seconds = end - start;
cout<< "elapsed time: " << elapsed_seconds.count() << "s\n";
}
这是Java程序...
public class FindDuplicate {
public static int FindDuplicateNaive(int[] input) {
for (int i = 0; i < input.length - 1; i++) {
for (int j = i + 1; j < input.length; j++) {
if (input[i] == input[j])
return input[i];
}
}
return -1;
}
public static int[] CreateTestCase(int n) {
// 1, 2, 3, 4, 5, 1 = n = 6
int[] output = new int[n];
int i;
for (i = 0; i < n - 1; i++) {
output[i] = i + 1;
}
output[i] = i;
return output;
}
public static void main(String[] args)
{
//Here also args[0] is 5,00,000
int number = Integer.parseInt(args[0]);
int[] input = CreateTestCase(number);
long start = System.currentTimeMillis();
int output = FindDuplicateNaive(input);
long end = System.currentTimeMillis();
System.out.println("Total time taken is: " + (end - start) / 1000.0 + " secs");
System.out.println(output);
}
你会震惊地知道同一个程序在 c++ 和 Java 中输入相同的输入所花费的时间。
在 Java 中:
总耗时:41.876 秒
499999
在 CPP 中:
启用优化后进入发布模式,
输出为:499999
经过时间:64.0293s
对此有任何想法,可能是什么原因?为什么 Java 需要 41.876 秒,而 CPP 需要 64.0293 秒?
【问题讨论】:
-
评论不用于扩展讨论;这个对话是moved to chat。
-
一个(真正可以接受的)答案应该包括由 C++ 编译器生成的程序集和 Hotspot JIT 生成的(最终的、优化的)结果。 (后者的相关摘录已包含在stackoverflow.com/a/56218736/3182664 中)
标签: java c++ performance visual-c++