Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Парсинг строк чисел 
:(
    Опции темы
o2n3e
Дата 11.11.2011, 06:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 19.8.2011

Репутация: -4
Всего: -5



Есть строки вида "X123.123Y123.123I123.123J123.123" - это набор координат. Строк в файле от десятков тысяч, до десятков миллионов. 
Задача: Производительность. На парсинг пары миллионов строк есть милисекунд 200, т.е. раза в два быстрее.

Изначально было реализованно на atof(), но это медленно. Числа имеют вид .###, т.е. всегда 3 знака после запятой - atof() был выпилен, и заменён atoi(из "123.123"  просто убералась точка) - медленно.

Моих знаний хватило на Это - медленно, примерно в 10раз бысрее atof() и 6раз atoi().
Числа всегда правильные и в одном порядке, грязный хак "*p > ',' && *p < 'A'" допустим, так же как и stoi() без проверки, числа от -60000.000 до 60000.000 - char g[12] хватит.

 Прошу указать ляпы, влияющие на производительность и направить на путь истинный, если что-то не так.

На моей машине - это 1100мс. Код должен работать на атоме 1.6ггц, который раза в 3медленней моего процессора.
Процессор:
 model name      : Intel® Core™2 CPU          6320  @ 1.86GHz
 cpu MHz         : 3149.476
Компилятор: gcc версия 4.6.2 (Gentoo 4.6.2 p1.0, pie-0.4.5) -O3 
P.S. Опыт программирования месяца 3, реально часов 30-40, прошу сильно не пинать.


Это сообщение отредактировал(а) o2n3e - 11.11.2011, 06:31
PM MAIL   Вверх
boostcoder
Дата 11.11.2011, 06:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



o2n3e, приаттач файл. и побольше.

Добавлено через 14 секунд
в смысле, файл со строками.
PM WWW   Вверх
borisbn
Дата 11.11.2011, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135





--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
math64
Дата 11.11.2011, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



stoi лучше переписать так (чтобы не было лишних разыменоваий указателя):
Код

int stoi( const char ** pp )
{
    const char* p = *pp
    int num = 0;
    int sign = 1;
    char ch;
    unsigned int digit;
    ch = *p;
    if ( ch == '-' )
    {
        sign = -1;
        ch = *++p;
    }
    while ( (digit = ch - '0') <= 9 )
    {
        num = num * 10 + digit;
        ch = *++p;
        if (ch == '.' )
            ch  = *++p;
    }
    *pp = p;
    return sign * num;
}


Добавлено через 5 минут и 18 секунд
Компилировать лучше в C без плюсов, использовать можно и в C++
PM   Вверх
volatile
Дата 11.11.2011, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(o2n3e @  11.11.2011,  06:29 Найти цитируемый пост)
Есть строки вида "X123.123Y123.123I123.123J123.123" - это набор координат. Строк в файле от десятков тысяч, до десятков миллионов. 
Задача: Производительность. На парсинг пары миллионов строк есть милисекунд 200

Длина строки = 32 символа. 
Пара миллионов строк ~ 66,000,000 байт. 

Милисекунд 200, то есть за секунду нужно обработать 330 мб.

Имхо, упрется в производительность диска.
330 Мб/сек - это слишком дофига, если это не RAID сервер какой-нибудь.
Цитата(o2n3e @  11.11.2011,  06:29 Найти цитируемый пост)
Код должен работать на атоме 1.6ггц


Хотя может я уже отстал от жизни, и такие диски номальны?

PM MAIL   Вверх
bsa
Дата 11.11.2011, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(volatile @  11.11.2011,  11:43 Найти цитируемый пост)
Хотя может я уже отстал от жизни, и такие диски номальны?
Вроде похожую скорость выдает самый навороченный SSD.
PM   Вверх
o2n3e
Дата 11.11.2011, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 19.8.2011

Репутация: -4
Всего: -5



Цитата(volatile @ 11.11.2011,  10:43)
Цитата(o2n3e @  11.11.2011,  06:29 Найти цитируемый пост)
Есть строки вида "X123.123Y123.123I123.123J123.123" - это набор координат. Строк в файле от десятков тысяч, до десятков миллионов. 
Задача: Производительность. На парсинг пары миллионов строк есть милисекунд 200

Длина строки = 32 символа. 
Пара миллионов строк ~ 66,000,000 байт. 

Милисекунд 200, то есть за секунду нужно обработать 330 мб.

Имхо, упрется в производительность диска.
330 Мб/сек - это слишком дофига, если это не RAID сервер какой-нибудь.
Цитата(o2n3e @  11.11.2011,  06:29 Найти цитируемый пост)
Код должен работать на атоме 1.6ггц


Хотя может я уже отстал от жизни, и такие диски номальны?

200мс - это на парсинг, без учёта io.

time ./symbols 123.pp (программка, которую я скопипастил где-то в интернетах.)
File contains 28331954 symbols.

real    0m0.439s
user    0m0.431s
sys     0m0.007s

time cat 123.pp &> /dev/null 

real    0m0.008s
user    0m0.001s
sys     0m0.008s

Файл с миллионом строк, 28331954 символов. И да, там ссд стоит 200МБ на чтение.

PM MAIL   Вверх
volatile
Дата 11.11.2011, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(o2n3e @  11.11.2011,  12:41 Найти цитируемый пост)
real    0m0.008s
user    0m0.001s
sys     0m0.008s

так я не понял, вы решили свою проблему, или нет?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0541 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.