Re[8]: Медленный C++
От: trop Россия  
Дата: 27.05.14 05:52
Оценка: +1 :))
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>непонятно зачем кому-то использовать голое API при наличии готовых библиотек, предоставляющих все необходимые возможности.

зачем с++ ???

код похож на каку, платят за весь тот объём знаний, ухищрений, наработок и костылей мало,
есть же нормальные ФЯ, в которых не нужно задумываться о каком-то токенайзере,
в которых можно строить всевозможные типы данных, хитросплетения функций,
в которых всё легко запараллеливается, кода мало и он красивый

можно трансформировать монады
-
Re[9]: Медленный C++
От: jazzer Россия Skype: enerjazzer
Дата: 27.05.14 05:55
Оценка: +4 :))) :)))
Здравствуйте, trop, Вы писали:

T>можно трансформировать монады


можно грабить корованы
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: Медленный C++
От: mik1  
Дата: 27.05.14 06:09
Оценка:
Здравствуйте, anatoly1, Вы писали:

Ф>>как я могу повторить ваш эксперимент?


A>Распарсить большой файл, каждая строчка которого имеет формат вида:

A>a1;a2;a3;a4;...;a200
A>Необходимо каждую такую строку преобразовать в объект наподобие:
A>obj = ["a1", "a2", ..., "a200"]

Остаются маленькие вопросы в размере файла, кодировке и в необходимости возвращать коллекции для каждой сторки (итератора / элементов по одному недостаточно?).
Патамучта в случае определенных ответов можно читать байты и отсекать по разделителю и/или newline.
Re[6]: Медленный C++
От: smeeld  
Дата: 27.05.14 06:10
Оценка: +2 -1 :)
Здравствуйте, Aртём, Вы писали:

Aё>Только Java и C (без плюсанутых) спасут этот мир .


Тут, на форуме, скромно пытаюсь высказать такую же мысль.
Страуструп дополнил чистый C OOП-ом. ООП это важно в ЯП. На этом можно было бы
и остановиться. Но C++ превратился в пастбище праздных академиков, которые
курят то, что даже мыщъху не известно. Они превратили язык в демонстрацию
своей нужности и важности. Лучше бы тесселяционные шейдеры в Mesa разрабатывали,
и вообще занимались чем полезным.
Re[3]: Медленный C++
От: Няшка Россия  
Дата: 27.05.14 06:51
Оценка:
Здравствуйте, smeeld, Вы писали:

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


_>>И соответственно этот код работает у меня где-то в 2,5 раза быстрее, чем его аналог на Питоне.


S>Осталось немного, и придёт, наконец, понимание, что здесь, в этой задачке, контейнеры и стримы вообще

S>ни куда не упёрлись. Их нельзя использовать на каждый чих. Сформировать malloc-ом буфер с содержимым
S>файла, разбить его на токены или предложения нуль терминатором, последовательно с занесением указателей в массив.
S>Вот указатели, а лучше их unique_ptr, можно уже складывать в вектор. Только не забыть задать ему первоначальный
S>размер отличный от нуля, а то vector, созданный дефолтным конструктором, сначала запрашивает память под объект,
S> потом под два, копируя туда содержание предыдущего буфера и удаляя его, потом под четыре и так далее, кто-то
S>скажет, что использовать такой способ организации буфера правильно?

Веткой случаем не промахнулись? Вам туда http://rsdn.ru/forum/flame.comp/5578775.1
Автор: alpha21264
Дата: 28.04.14
80% людей оценивают свое мастерство выше среднего...
Re[4]: Медленный C++
От: smeeld  
Дата: 27.05.14 07:04
Оценка:
Здравствуйте, Няшка, Вы писали:


Н>Веткой случаем не промахнулись?


Нет. Шаблоны фундаментальный и необходимый инструмент. Если Вас не затруднит прочитать
внимательней, то поймёте, что речь идёт о неаккуратном, бездумном
использовании контейнеров.
Re[2]: Медленный C++
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 27.05.14 07:14
Оценка:
Здравствуйте, Философ, Вы писали:

Ф>Как измерения проводились?

Ф>Что означают эти строки?
Ф>чем "real" отличается от "sys"?


man time 1


link
Re[5]: Медленный C++
От: Няшка Россия  
Дата: 27.05.14 07:48
Оценка:
Здравствуйте, smeeld, Вы писали:

S>Здравствуйте, Няшка, Вы писали:



Н>>Веткой случаем не промахнулись?


S>Нет. Шаблоны фундаментальный и необходимый инструмент. Если Вас не затруднит прочитать

S>внимательней, то поймёте, что речь идёт о неаккуратном, бездумном
S>использовании контейнеров.

1. Vector — это шаблон
2. Рост которого не всегда сопровождается копированием данных — зависит от реализации и аллокатора
3. Если Вы работаете не только с однобайтовым английским языком, то создать хороший текстовый парсер не на шаблонах будет тугой задачей
4. Читать весь файл csv в память и разбивать терминатором, чтобы потом копировать memcpy/strcpy — это бредовая идея для домашнего программирования.
Подумайте внимательно, как будет работать Ваше решение на большом файле?.. а на сервере в несколько потоков?..
Какая будет стратегия на ошибки выделения памяти??? Как будете отдавать процессорное время другим задачам??? Куча не нужных проблем появится.
80% людей оценивают свое мастерство выше среднего...
Re[3]: Медленный C++
От: jazzer Россия Skype: enerjazzer
Дата: 27.05.14 07:49
Оценка:
Здравствуйте, anatoly1, Вы писали:

A>Распарсить большой файл, каждая строчка которого имеет формат вида:

A>a1;a2;a3;a4;...;a200
A>Необходимо каждую такую строку преобразовать в объект наподобие:
A>obj = ["a1", "a2", ..., "a200"]

И что дальше? Обработать каждую строчку и забыть? Или поиметь весь файл в памяти в виде развесистой структуры?

Иными словами, что должно остаться в памяти после окончания парсинга файла?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[5]: Медленный C++
От: Няшка Россия  
Дата: 27.05.14 07:55
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

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


S>>Покапитанить решили? Не интересно так.


PD>Интересно или нет, но эту функцию никто здесь не упомянул. Получилось впечатление, что либо нужно писать что-то совсем уж вручную (как у тебя), или без STL никак не обойтись. Вот я и решил напомнить...


эта функция зависит от кодировки, а шаблоны нет
впрочем, собственная ее реализация для шаблона — копеечный вопрос
80% людей оценивают свое мастерство выше среднего...
Re[4]: Медленный C++
От: anatoly1  
Дата: 27.05.14 08:01
Оценка:
Здравствуйте, jazzer, Вы писали:

J>И что дальше? Обработать каждую строчку и забыть?


Да, именно так.

В итоге, думаю, остановлюсь на таком варианте:

int main()
{
    std::ifstream f;
    f.open("test.csv");

    std:string s;
    std::vector<std::string> sv(201);
    std::stringstream ss;
    std::string item;

    while ( std::getline(f, s) )
    {
        ss.clear();
        ss.str(s);
        for (int i = 0; std::getline(ss, item, ';'); i++)
            std::swap(sv[i], item);
    }

    return 0;
}



real    0m2.965s
user    0m2.564s
sys    0m0.104s
Re[6]: Медленный C++
От: Pavel Dvorkin Россия  
Дата: 27.05.14 08:32
Оценка:
Здравствуйте, Няшка, Вы писали:


Н>эта функция зависит от кодировки, а шаблоны нет


Хм... Что тут зависит от кодировки ?

char * __cdecl strtok (
        char * string,
        const char * control
        )
#endif  /* _SECURE_VERSION */
{
        unsigned char *str;
        const unsigned char *ctrl = control;

        unsigned char map[32];
        int count;

#ifdef _SECURE_VERSION

        /* validation section */
        _VALIDATE_RETURN(context != NULL, EINVAL, NULL);
        _VALIDATE_RETURN(string != NULL || *context != NULL, EINVAL, NULL);
        _VALIDATE_RETURN(control != NULL, EINVAL, NULL);

        /* no static storage is needed for the secure version */

#else  /* _SECURE_VERSION */

        _ptiddata ptd = _getptd();

#endif  /* _SECURE_VERSION */

        /* Clear control map */
        for (count = 0; count < 32; count++)
                map[count] = 0;

        /* Set bits in delimiter table */
        do {
                map[*ctrl >> 3] |= (1 << (*ctrl & 7));
        } while (*ctrl++);

        /* Initialize str */

        /* If string is NULL, set str to the saved
         * pointer (i.e., continue breaking tokens out of the string
         * from the last strtok call) */
        if (string)
                str = string;
        else
                str = _TOKEN;

        /* Find beginning of token (skip over leading delimiters). Note that
         * there is no token iff this loop sets str to point to the terminal
         * null (*str == '\0') */
        while ( (map[*str >> 3] & (1 << (*str & 7))) && *str )
                str++;

        string = str;

        /* Find the end of the token. If it is not the end of the string,
         * put a null there. */
        for ( ; *str ; str++ )
                if ( map[*str >> 3] & (1 << (*str & 7)) ) {
                        *str++ = '\0';
                        break;
                }

        /* Update nextoken (or the corresponding field in the per-thread data
         * structure */
        _TOKEN = str;

        /* Determine if a token has been found. */
        if ( string == str )
                return NULL;
        else
                return string;
}



Н>впрочем, собственная ее реализация для шаблона — копеечный вопрос
With best regards
Pavel Dvorkin
Re[7]: Медленный C++
От: Няшка Россия  
Дата: 27.05.14 08:47
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, Няшка, Вы писали:



Н>>эта функция зависит от кодировки, а шаблоны нет


PD>Хм... Что тут зависит от кодировки ?


Пихните туда UTF — узнаете
80% людей оценивают свое мастерство выше среднего...
Re[5]: Медленный C++
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 27.05.14 08:58
Оценка:
Здравствуйте, smeeld, Вы писали:

S>Для начала.

S>Потом и свои аллокаторы для string и vector назначить не мешало бы.

really? питонокод в данном примере довольно туп и идиоматичен
Re[8]: Медленный C++
От: smeeld  
Дата: 27.05.14 09:11
Оценка:
Здравствуйте, Няшка, Вы писали:

Н>Пихните туда UTF — узнаете


Если доработать так, чтоб '\0' не вставлялось, то и utf переварит спокойно-
сравнение ведь побайтное, и неважно что означают эти байты и совокупности из них.
Re[2]: Медленный C++
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 27.05.14 09:18
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>В версии на C++ аллоцируется много мутабельных строк, в то время как в версии на Python строки иммутабельные, для них просто берётся view.

EP>Плюс, у тебя vector аллоцируется каждый раз создаётся заново, а нужно создать его только один раз и переиспользовать его capacity многократно.

Может быть дело еще и в ifstream. Возможно там буферизация реализована хуже чем в питоне (я не проверял).
Re[6]: Медленный C++
От: smeeld  
Дата: 27.05.14 09:33
Оценка:
Здравствуйте, Няшка, Вы писали:

Н>1. Vector — это шаблон


Vector-это контейнер, обобщённый с помощью шаблонов.

Н>2. Рост которого не всегда сопровождается копированием данных — зависит от реализации и аллокатора

У аллокатора только спрашивают указатель, вызывая его allocate, и ему же велят удалять кусок памяти, вызывая его deallocate. Всё.
С самим данныи контейнер делает что ему хочется. И vector, если вновь помещаемые данные превысят имеющийся объём,
вызывает allocate, копирует в новый буфер предыдущий, и вызывает deallocate предыдущему.

Н>3. Если Вы работаете не только с однобайтовым английским языком, то создать хороший текстовый парсер не на шаблонах будет тугой задачей

Н>4. Читать весь файл csv в память и разбивать терминатором, чтобы потом копировать memcpy/strcpy — это бредовая идея для домашнего программирования.
Н> Подумайте внимательно, как будет работать Ваше решение на большом файле?..

А никто и не спорит про большие файлы. Большие файлы никто копировать в ram и не собирался, не надо капитанить.
Приведённый в треде пример с маппингом и двумя указателями известен всем страждущим. Только в контексте задачи TC,
всё это тут накручивать будет лишним. Речь изначально велась об ускорении работы приложения.
И парсинг побайтовым сравнением можно проводить на тексте любой кодировки. Шаблон понадобится для определения конкретной специфики
сравнения при поиске, и выдачи результатов. И всё спокойно проделывается и без задействования контейнеров.

H> а на сервере в несколько потоков?..

Н> Какая будет стратегия на ошибки выделения памяти??? Как будете отдавать процессорное время другим задачам??? Куча не нужных проблем появится.

И чем здесь именно контейнеры на шаблонах обеспечат threading safe? Разруливать всё придётся так же, как и без использования контейнеров.
Re[7]: Медленный C++
От: Няшка Россия  
Дата: 27.05.14 10:21
Оценка: -1
Здравствуйте, smeeld, Вы писали:

S>Здравствуйте, Няшка, Вы писали:


Н>>2. Рост которого не всегда сопровождается копированием данных — зависит от реализации и аллокатора

S>У аллокатора только спрашивают указатель, вызывая его allocate, и ему же велят удалять кусок памяти, вызывая его deallocate. Всё.
S>С самим данныи контейнер делает что ему хочется. И vector, если вновь помещаемые данные превысят имеющийся объём,
S>вызывает allocate, копирует в новый буфер предыдущий, и вызывает deallocate предыдущему.

если данные не переехали, то их можно и не копировать

Н>>3. Если Вы работаете не только с однобайтовым английским языком, то создать хороший текстовый парсер не на шаблонах будет тугой задачей

Н>>4. Читать весь файл csv в память и разбивать терминатором, чтобы потом копировать memcpy/strcpy — это бредовая идея для домашнего программирования.
Н>> Подумайте внимательно, как будет работать Ваше решение на большом файле?..

S>А никто и не спорит про большие файлы. Большие файлы никто копировать в ram и не собирался, не надо капитанить.

S>Приведённый в треде пример с маппингом и двумя указателями известен всем страждущим. Только в контексте задачи TC,
ТС в глобальном плане задачи не освещал
может он на серваке логи крутить в csv хочет и ищет вариант быстрее...

S>всё это тут накручивать будет лишним. Речь изначально велась об ускорении работы приложения.

Ускорение на 5 кб не имеет значения, любой вариант сгодится. Хоть на регулярках... затраты на современной технике будут копеешные.
Скорость актуальна в бигдата и высоконагруженном программировании.
Сколько миллисекунд там эксель непосредственно будет читать табличку из csv — всем насрать.

S>И парсинг побайтовым сравнением можно проводить на тексте любой кодировки. Шаблон понадобится для определения конкретной специфики

S>сравнения при поиске, и выдачи результатов. И всё спокойно проделывается и без задействования контейнеров.

Можно, можно... яйца граблями чесать, но процесс и результат вряд ли будут удовлетворительными.

H>> а на сервере в несколько потоков?..

Н>> Какая будет стратегия на ошибки выделения памяти??? Как будете отдавать процессорное время другим задачам??? Куча не нужных проблем появится.

S>И чем здесь именно контейнеры на шаблонах обеспечат threading safe? Разруливать всё придётся так же, как и без использования контейнеров.

Если бахать всё сразу в память, то конечно тут помочь уже нечем.
80% людей оценивают свое мастерство выше среднего...
Re[8]: Медленный C++
От: Pavel Dvorkin Россия  
Дата: 27.05.14 10:26
Оценка:
Здравствуйте, Няшка, Вы писали:


PD>>Хм... Что тут зависит от кодировки ?


Н>Пихните туда UTF — узнаете


Вообще-то strtok, как и string.h вообще, не предназначена для того, чтобы работать с UTF. Если UTF сунуть в обычную strlen, то результат, мягко говоря, будет тоже далек от истины. Да и вообще кроме strcpy/strcat мало что будет работать.
With best regards
Pavel Dvorkin
Re[8]: Медленный C++
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 27.05.14 10:40
Оценка:
Здравствуйте, Няшка, Вы писали:

S>>всё это тут накручивать будет лишним. Речь изначально велась об ускорении работы приложения.

Н>Ускорение на 5 кб не имеет значения, любой вариант сгодится. Хоть на регулярках... затраты на современной технике будут копеешные.

Изначально как раз и говорится, что затраты далеко не копеечные.

Н>Скорость актуальна в бигдата и высоконагруженном программировании.

Н>Сколько миллисекунд там эксель непосредственно будет читать табличку из csv — всем насрать.

А эксель на атомном планшете? А эксель на мобилке? Поставим туда ксеон для ускорения?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.