Java和C中的字符串比较性能

时间:2015-10-08 02:46:26

标签: string performance time compare execution

我需要测量比较两个字符串的函数的性能。我的任务是用Java和C编写它并比较执行时间。出于测试目的,我生成了一个包含100000个随机字符串的txt文件,每个字符串从100到200个字符不等。使用它们我调用比较函数20&000,000次。在Java中,它需要大约500ms而在C中执行时间是0ms(我在两种语言中对exaclty完全相同的测试)。即使我将它增加到C中的20&000; 000&000;' 000,它仍然可以测量0ms的持续时间。这怎么可能?我错过了一些重要的事情吗?

在Java中实现

public class StringComparer {

    public static boolean compareStrings(String string1, String string2) {

        if(string1.length() != string2.length()) {
            return false;
        }

        for (int i = 0; i < string1.length(); i++) {
            if(string1.charAt(i) != string2.charAt(i)) {
                return false;
            }
        }

        return true;
    }
}

在C

中实施
bool string_compare(char* s1, char* s2)
{   
    int i = 0;

    while (s1[i] != NULL && s1[i] == s2[i])
        i++;

    return s1[i] == s2[i];
}

这是我用来测试C

中的效果的代码
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <windows.h>

#define NUMBER_OF_WORDS 100000
#define MAX_WORD_LENGTH 200

long long milliseconds_now() {
    static LARGE_INTEGER s_frequency;
    BOOL s_use_qpc = QueryPerformanceFrequency(&s_frequency);
    if (s_use_qpc) {
        LARGE_INTEGER now;
        QueryPerformanceCounter(&now);
        return (1000LL * now.QuadPart) / s_frequency.QuadPart;
    }
    else {
        return GetTickCount();
    }
}

int main()
{
    char* fileName = "tests.txt";
    FILE *file = fopen(fileName, "r");

    char* words[NUMBER_OF_WORDS];

    long long i, j;

    for (i = 0; i < NUMBER_OF_WORDS; i++) {
        words[i] = (char*)malloc((MAX_WORD_LENGTH + 1) * sizeof(char));
        fgets(words[i], MAX_WORD_LENGTH + 1, file);
    }

    long long repeats = 10000000000 / NUMBER_OF_WORDS;

    long long start = milliseconds_now();

    for (i = 0; i < repeats; i++)
    {
        for (j = 0; j < NUMBER_OF_WORDS - 1; j++)
        {
            ;
        }
    }

    long long loopDuration = milliseconds_now() - start;

    start = milliseconds_now();

    for (i = 0; i < repeats; i++)
    {
        for (j = 0; j < NUMBER_OF_WORDS - 1; j++)
        {
            string_compare(words[j], words[j + 1]); //compare different strings
            string_compare(words[j], words[j]); //compare the same strings
        }
    }

    long long customFunctionDuration = milliseconds_now() - start;

    printf("Loop duration: %lld\n", loopDuration);
    printf("Custom function duration: %lld - %lld = %lld ms", customFunctionDuration, loopDuration, customFunctionDuration - loopDuration);

    return 0;
}

1 个答案:

答案 0 :(得分:0)

您的代码的可观察行为与完全不执行任何操作的代码完全相同。您需要将字符串比较的结果作为程序可观察行为的一部分,这样它们才能被优化为零。尝试计算字符串匹配的次数以及字符串不匹配并输出该数字的次数。