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

PD>Начальства нет.

Сиротка, значит.

(c)Формула Любви
С уважением, Gleb.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
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
Re[27]: Об эффективности программ
От: Pavel Dvorkin Россия  
Дата: 19.10.05 12:48
Оценка:
Здравствуйте, GlebZ, Вы писали:

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


GZ>Сиротка, значит.


Ну я не совсем точно выразился. В университете есть, конечно. А в остальном предпочитаю иметь дело с заказчиком. ИМХО он клиент, а не начальство.
With best regards
Pavel Dvorkin
Re[25]: Об эффективности программ
От: Pavel Dvorkin Россия  
Дата: 19.10.05 12:50
Оценка:
Здравствуйте, srggal, Вы писали:


S>Решил помочь с примером:

S> Есть в физике понятие материальная точка — это точка, размерами которой можно пренебречь, соответсвенно есть просто точка — её размерами пренебрегать не стоит.


S>Соответсвенно, в Вашем коде, если я правильно понял спринтф — материальная точка .


Вообще-то, насколько я помню, у просто точки размеров нет вообще. Если ты имел в виду тело — тогда да.
With best regards
Pavel Dvorkin
Re[24]: Об эффективности программ
От: Pavel Dvorkin Россия  
Дата: 19.10.05 12:52
Оценка:
Послелдние три числа здесь по ошибке попали.

PD>3.05

PD>3.09
PD>3.08
With best regards
Pavel Dvorkin
Re[26]: Об эффективности программ
От: srggal Украина  
Дата: 19.10.05 13:12
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, srggal, Вы писали:



S>>Решил помочь с примером:

S>> Есть в физике понятие материальная точка — это тело, размерами которого можно пренебречь, соответсвенно есть просто точка — её размерами пренебрегать не стоит.

PD>Вообще-то, насколько я помню, у просто точки размеров нет вообще. Если ты имел в виду тело — тогда да.


Именно, иправил формулировку
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[24]: Об эффективности программ
От: srggal Украина  
Дата: 19.10.05 14:40
Оценка: :))
Здравствуйте, Pavel Dvorkin, Вы писали:

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


Хоть Вы и читтер уважаемый, ан все равно приятно увидеть Думмера, ( поглаживая свой БФЖ ), и вспоминать как БФЖ рулит на 7мом уровне в дедматч. Эххх.

ЗЫ Решпект
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[25]: Об эффективности программ
От: Pavel Dvorkin Россия  
Дата: 20.10.05 05:05
Оценка: :)
Здравствуйте, srggal, Вы писали:

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



S>Хоть Вы и читтер уважаемый, ан все равно приятно увидеть Думмера, ( поглаживая свой БФЖ ), и вспоминать как БФЖ рулит на 7мом уровне в дедматч. Эххх.


Ради бога, переведи на русский, а то я даже не знаю, как на все это реагировать .

P.S. Код, который ты цитируешь — не мой, см.

http://www.rsdn.ru/Forum/Message.aspx?mid=1443856&amp;only=1
Автор: WolfHound
Дата: 19.10.05
With best regards
Pavel Dvorkin
Re[24]: Об эффективности программ
От: Дарней Россия  
Дата: 20.10.05 06:03
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

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


PD>Не так уж много, верно, процентов 10-15. Только вот здесь всего 2 строки конкатенируются, а у меня их было обычно 5-10.


ну раз уж пошла такая пьянка — сделаем условия более близкими к твоей задаче, как ты ее описываешь

#include "stdafx.h"
#include <windows.h>
#include <conio.h>
#include <string>

int _tmain(int argc, _TCHAR* argv[])
{ 
    {
        DWORD dwTimeStart = GetTickCount();
        char* szFirstName = "11111111111111111111111111111111111111111111111111111111111111111111111111111";
        char* szLastName = "22222222222222222222222222222222222222222222222222222222222222222222222222222";
        char* astr = "11111111111111111111111111111111111111111111111111111111111111111111111111111";
        char* bstr = "11111111111111111111111111111111111111111111111111111111111111111111111111111";

        char szTotal[500];
        for(size_t i=0;i<10000000;++i)
        {
            strcpy(szTotal, szFirstName);
            strcat(szTotal, szLastName);
            strcat(szTotal, astr);
            strcat(szTotal, bstr);
        }

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

    {
        DWORD dwTimeStart = GetTickCount();
        std::string firstName = "11111111111111111111111111111111111111111111111111111111111111111111111111111";
        std::string lastName = "22222222222222222222222222222222222222222222222222222222222222222222222222222";
        std::string astr = "11111111111111111111111111111111111111111111111111111111111111111111111111111";
        std::string bstr = "11111111111111111111111111111111111111111111111111111111111111111111111111111";

        std::string res;
        for(size_t i=0;i<10000000;++i)
        {
            res = firstName;
            res += lastName;
            res += astr;
            res += bstr;
        }

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

    getch();
  return 0;
}

компилируем, конечно же, в релизе
получаем:

7.453000
2.953000

то есть, вариант с strcat медленнее более чем в два раза
и здесь еще только четыре строки — при росте количества строк и их длины разрыв увеличится еще больше
поздравляю вас, товарищ, с выдающимися успехами в области оптимизации!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[24]: Об эффективности программ
От: WolfHound  
Дата: 20.10.05 06:46
Оценка: +1
Здравствуйте, Pavel Dvorkin, Вы писали:

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


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

            string szFirstName = "11111111111111111111111111111111111111111111111111111111111111111111111111111";
            string szLastName = "22222222222222222222222222222222222222222222222222222222222222222222222222222";

                    string str = szFirstName + szLastName;

0,1317845
            StringBuilder sb = new StringBuilder();
...
                for (int i = 0; i < 100000; ++i)
                {
                    sb.Length = 0;
                    sb.Append(szFirstName);
                    sb.Append(szLastName);
                }

0,04493758

Оптимизированый вариант на C# получается на уровне С++ Ну чуть медленнее.
Кстати для корректности теста перепиши свои на wchar_t.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[25]: Об эффективности программ
От: alexeiz  
Дата: 20.10.05 07:01
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH> StringBuilder sb = new StringBuilder();

WH>...
WH> for (int i = 0; i < 100000; ++i)
WH> {
WH> sb.Length = 0;
WH> sb.Append(szFirstName);
WH> sb.Append(szLastName);
WH> }
WH>[/c#]
WH>0,04493758

Так не пойдет. Чтобы было эквивалентно С++ варианту нужно ещё из StringBuilder получить String.

WH>Оптимизированый вариант на C# получается на уровне С++ Ну чуть медленнее.

WH>Кстати для корректности теста перепиши свои на wchar_t.
Re[26]: Об эффективности программ
От: GlebZ Россия  
Дата: 20.10.05 08:11
Оценка:
Здравствуйте, alexeiz, Вы писали:

A>Так не пойдет. Чтобы было эквивалентно С++ варианту нужно ещё из StringBuilder получить String.

Почему?

С уважением, Gleb.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[27]: Об эффективности программ
От: alexeiz  
Дата: 20.10.05 08:26
Оценка: +1 -1
Здравствуйте, GlebZ, Вы писали:

GZ>Здравствуйте, alexeiz, Вы писали:


A>>Так не пойдет. Чтобы было эквивалентно С++ варианту нужно ещё из StringBuilder получить String.

GZ>Почему?

В C++ версии на входе две строки на выходе одна. В C# — на выходе какой-то буфер (StringBuilder то есть). Чтобы его использовать как строку, нужно еще совершить преобразование.
Re[28]: Об эффективности программ
От: GlebZ Россия  
Дата: 20.10.05 09:15
Оценка: +1
Здравствуйте, alexeiz, Вы писали:

A>Здравствуйте, GlebZ, Вы писали:


GZ>>Здравствуйте, alexeiz, Вы писали:


A>>>Так не пойдет. Чтобы было эквивалентно С++ варианту нужно ещё из StringBuilder получить String.

GZ>>Почему?

A>В C++ версии на входе две строки на выходе одна. В C# — на выходе какой-то буфер (StringBuilder то есть). Чтобы его использовать как строку, нужно еще совершить преобразование.

Неа. На выходе один и тот же буфер содержащий строку. 100 байт стека. StringBuilder.ToString() — это не преобразование строки, а возврат буфера в виде строки. То есть все абсолютно аналогично.
Другой вопрос в Net с одним и тем же буфером создавать две строки нельзя. Поэтому аналогичным будет создание всегда новой строки.

С уважением, Gleb.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[29]: Об эффективности программ
От: alexeiz  
Дата: 20.10.05 10:04
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>Здравствуйте, alexeiz, Вы писали:


A>>Здравствуйте, GlebZ, Вы писали:


GZ>>>Здравствуйте, alexeiz, Вы писали:


A>>>>Так не пойдет. Чтобы было эквивалентно С++ варианту нужно ещё из StringBuilder получить String.

GZ>>>Почему?

A>>В C++ версии на входе две строки на выходе одна. В C# — на выходе какой-то буфер (StringBuilder то есть). Чтобы его использовать как строку, нужно еще совершить преобразование.

GZ>Неа. На выходе один и тот же буфер содержащий строку. 100 байт стека. StringBuilder.ToString() — это не преобразование строки, а возврат буфера в виде строки. То есть все абсолютно аналогично.

Только с той разницей, что чтобы преобразовать буфер в строку в C, не нужно делать ничего. Например, нам надо передать строку после конкатенации в функцию foo(char*). В C — просто передаём этот самый буфер. В C# функция будет выглядеть как foo(string), и чтобы передать туда результирующую строку нам нужно сначала преобразовать StringBuffer в String.

GZ>Другой вопрос в Net с одним и тем же буфером создавать две строки нельзя. Поэтому аналогичным будет создание всегда новой строки.


В этом тесте используется конкретная возможность C — создание строк на стеке с прямой целью, чтобы показать приемущество этого языка по сравнению с C#.
Re[7]: Об эффективности программ
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.10.05 10:20
Оценка:
Здравствуйте, GlebZ, Вы писали:

ПК>>С такими ошибками в C++ шаблоны могут помочь бороться.

GZ>Заметка из жизни. Если у программиста проблемы с ДНК, то C# многое прощает, а вот шаблоны в С++ многое усугубляют.

Не. Если проблемы в ДНК, то этому человеку Шарп уже не поможит. Но несоменно что в виду типобезопасности и малограбельности Шарп делает более защищенными тех кто волею судеб вынужден рабоатать в одной команде с наситями проблемных ДНК.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[14]: Об эффективности программ
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.10.05 10:20
Оценка: :)
Воистину, Манька Величко страшная баба. Недай бог с ней познакомиться...
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Об эффективности программ
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.10.05 10:20
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>Не думал что подобная заметка из жизни вызывет флейм о вилках и детской посуде.


Хэх. Не знашь ты жизни. Скажу чесно я точно знал реакцию. Она просто не могла быть другой.

И дело тут в психологии. Людям больше всего ненравится признавать свои ошибки и недостатки в любимых вещах. Причем если это не делать, то со временем формируется те самые мании и фобии.

GZ>Так что если говорить о промышленных языках, то я бы сказал что они есть компромисс — помочь первым, и не мешать вторым.


Любое достойное дело и или вещь является компромисом. Бескомромисной может быть только вера и преданность.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[26]: Об эффективности программ
От: srggal Украина  
Дата: 20.10.05 10:36
Оценка: +1 :)
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, srggal, Вы писали:


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



S>>Хоть Вы и читтер уважаемый, ан все равно приятно увидеть Думмера, ( поглаживая свой БФЖ ), и вспоминать как БФЖ рулит на 7мом уровне в дедматч. Эххх.


PD>Ради бога, переведи на русский, а то я даже не знаю, как на все это реагировать .


PD>P.S. Код, который ты цитируешь — не мой, см.


Уппс, ошибочка вышла.... Еще одна проблема с копипастом
Выделенные строки это читкоды легендарного дума, если не ошибаюсь:

iddqd — God mode
idkfa — all weapon
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[25]: Об эффективности программ
От: Pavel Dvorkin Россия  
Дата: 20.10.05 10:37
Оценка:
Здравствуйте, Дарней, Вы писали:

Д>то есть, вариант с strcat медленнее более чем в два раза

Д>и здесь еще только четыре строки — при росте количества строк и их длины разрыв увеличится еще больше
Д>поздравляю вас, товарищ, с выдающимися успехами в области оптимизации!

Батенька, вы бы хоть читали внимательно. Я и писал-то, что strcat медленнее.
With best regards
Pavel Dvorkin
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.