Здравствуйте, 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