-4

選択ソートアルゴリズムを使用して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コードよりも高速であるべきではありませんか?

この問題を解決するのを手伝ってもらえますか?私の悪い英語に感謝し、申し訳ありません。

4

2 に答える 2

7

手始めに、Javaコードは10までの乱数のみを生成し、c ++は100までです。明らかに、より多くのスワップがあります。通常、この種のテストでは、まったく同じ配列をテストする必要があります。

于 2013-03-25T13:47:34.647 に答える
0

C ++スワップはどこにありますか?>このテンプレートを使用していますか?template std::swap(T&x,T&y)?このテンプレートは、moveコンストラクターと割り当てを持つ「大きな」タイプに最適です。インデックスを使用して、Javaテストで1つのALを試してください。

于 2013-03-26T08:51:03.850 に答える