Re[23]: Об эффективности программ
От: Pavel Dvorkin Россия  
Дата: 19.10.05 12:46
Оценка: -1
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, Pavel Dvorkin, Вы писали:


WH>ЗЫ Замеры производились 100 раз. Самые быстрые и самые медленные результаты отбрасывались, остальные усреднялись.

WH>ЗЗЫ VS 2003

Вот мои результаты. Количество итераций цикла увеличил в 100 раз — не люблю я слишком малые значения

Твой код на C#. VS 2003, Release


    private static string Concat(string s1, string s2)
        {
            return s1 + s2;
        }
        [STAThread]
        static void Main(string[] args)
        {
            DateTime dStart = DateTime.Now;
            for (int i = 0; i < 10000000; ++i)
                Concat("iddqd", "idkfa");
            DateTime dEnd = DateTime.Now;
            Console.WriteLine(dEnd - dStart);
        }


100 раз пропускать не стал, вот первые 5 результатов

2.28
2.16
2.07
2.07
2.12

На C++ соорудил вот такой код — не слишком долго думая. VS 2003, Release



int _tmain(int argc, _TCHAR* argv[])
{ 
    DWORD dwTimeStart = GetTickCount();
    char* szFirstName = "iddqd";
        char* szLastName = "idkfa";
        char szTotal[500];
    char * pszTmpTotal,*pszTmpFirst, *pszTmpLast;
        for(size_t i=0;i<10000000;++i)
        {
            for(pszTmpTotal = szTotal,pszTmpFirst = szFirstName ; *pszTmpFirst;*pszTmpTotal++=*pszTmpFirst++); 
            for(pszTmpLast = szLastName; *pszTmpLast;*pszTmpTotal++=*pszTmpLast++); 
            *pszTmpTotal = '\0';
        }
    DWORD dwTimeEnd = GetTickCount();
    printf("%f\n",float(dwTimeEnd - dwTimeStart) / 1000);
    return 0;
}




Результаты

0.31
0.33
0.33
0.36
0.33

А теперь strcpy — strcat попробуем


int _tmain(int argc, _TCHAR* argv[])
{ 
    DWORD dwTimeStart = GetTickCount();
    char* szFirstName = "iddqd";
        char* szLastName = "idkfa";
        char szTotal[500];
        for(size_t i=0;i<10000000;++i)
        {
            strcpy(szTotal, szFirstName);
            strcat(szTotal, szLastName);
        }

    DWORD dwTimeEnd = GetTickCount();
    printf("%f\n",float(dwTimeEnd - dwTimeStart) / 1000);
    return 0;
}


0.27
0.30
0.27
0.28
0.28

Ай-яй-яй!!! Как же это я так оплошал . Говорил, что , мол, нет времени на длину строки, проход мол, а ведь strcat — тоже проход, а оказывается, это быстрее, чем мой однопроходной код! Вот и делай после этого заявления про оптимизацию

Ничего, реабилитируемся. Просто уж строки слишком короткие.Заменим их на

char* szFirstName = "11111111111111111111111111111111111111111111111111111111111111111111111111111";
char* szLastName = "22222222222222222222222222222222222222222222222222222222222222222222222222222";


C++, мой вариант

4.18
4.11
4.15
4.11
4.30


С++, strcat

4.64
4.72
4.75
4.56
4.67

Не так уж много, верно, процентов 10-15. Только вот здесь всего 2 строки конкатенируются, а у меня их было обычно 5-10. При concat второй строки проходится первая (поиск конца строки в szTotal) , при concat третьей — первая со второй, и т.д. В общем, двойной цикл

Ну а вот что здесь C# дает

11.44
11.94
11.50
11.81
11.50
3.05
3.09
3.08
With best regards
Pavel Dvorkin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.