【问题标题】:C++ vs Java - Selection Sort PerformancesC++ vs Java - 选择排序性能
【发布时间】:2013-03-26 16:51:03
【问题描述】:

我正在使用选择排序算法测试 Java 和 C++ 性能。

这是 Java 代码:

public static void main(String[] args) {

    int[] mArray = new int[100000];
    fillArrayRandomly(mArray, 10);

    long timeStart = System.currentTimeMillis();
    selectionSort(mArray);
    long timeEnd = System.currentTimeMillis();

    System.out.println((timeEnd - timeStart) + "ms");
}

public static void selectionSort(int[] array) {
    for(int i=0; i<array.length-1; i++)
        for(int j=i+1; j<array.length; j++)
            if(array[j]<array[i])
                swap(array, i, j);
}

public static void swap(int[] array, int i, int j) {
    int tmp = array[i];
    array[i] = array[j];
    array[j] = tmp; 
}

public static void fillArrayRandomly(int array[], int maxNum) {
    Random generator = new Random(); 

    for(int i=0; i<array.length; i++)
        array[i] = generator.nextInt(maxNum);
}

public static void printArray(int array[]) {
    for(int i=0; i<array.length; i++)
        System.out.println(array[i]);
}

这是 C++ 代码:

void fillArrayRandomly(int *array, int dim, int max)
{
    srand(time(NULL));

    for(int i=0; i<dim; i++)
        array[i] = rand() % max;
}

void selectionSort(int *array, int dim)
{
    for(int i=0; i<dim-1; i++)
        for(int j=i+1; j<dim; j++)
            if(array[i] > array[j])
                swap(array[i], array[j]);
}

int main()
{
    int DIM = 100000;
    int *array = new int[DIM];

    fillArrayRandomly(array, DIM, 100);

    long tStart = GetTickCount();
    selectionSort(array, DIM);
    long tEnd = GetTickCount(); 

    cout << tEnd-tStart << " ms" << endl;
    system("PAUSE");
}

这是包含 100000 个元素的数组的结果:

C++: 6584 毫秒

Java: 3942 毫秒

在我看来,这听起来很奇怪。 C++ 代码不应该比 Java 代码快吗?

你能帮我解决这个问题吗? 感谢和抱歉我的英语不好。

【问题讨论】:

  • 您是否在编译 C++ 代码时启用了任何优化?
  • JVM 做了很多优化,在你的 C++ 代码优化方面可能有很多潜力。
  • 我猜你没有开启优化。你会为 C++ 代码展示你的编译器选项吗?
  • FWIW C++ 代码在我的机器上比 Java 代码执行得更快(我打开了优化),但这并不意味着很多——您使用的代码在这两种语言中都没有特定的优势并且将执行大致相同的操作。这不是用于比较这些语言各自性能的有趣代码。
  • @The.Coder 你是在 VS 2012 中调试还是发布版本?

标签: java c++ sorting selection


【解决方案1】:

对于初学者,您的 java 代码只生成直到 10 的随机数,而 c++ 直到 100,显然会有更多的交换。通常对于这种测试,您想要测试完全相同的数组。

【讨论】:

  • 我也在 Java 中尝试使用随机数直到 100,但差异仍然是 2 秒。我会尝试使用相同的数组。
  • 实际上我尝试了相同的数组,Java 仍然表现更好。
【解决方案2】:

你的 c++ 交换在哪里? >你在使用template std::swap(T&amp;x,T&amp;y)? 这个模板最适合带有移动构造函数和赋值的“大”类型。尝试使用索引在您的 java 测试中使用一个 als。

【讨论】:

    猜你喜欢
    • 2017-06-09
    • 2014-09-14
    • 2019-03-08
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    相关资源
    最近更新 更多