Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Заблокирован
1

Очень медленное выполнение .c_str() в minGW

02.08.2015, 18:45. Показов 803. Ответов 15
Метки нет (Все метки)

Есть функция:
C++
1
sscanf(line.c_str(), "%d\t%d\t%hu.%hu.%hu\t%hu:%hu:%hu\t%lf", &tmpData.Pip, &tmpData.Tm, &tmpData.Year, &tmpData.Mont, &tmpData.Day, &h, &tmpData.Min, &tmpData.Sec, &tmpData.Spd);
line типа string;

Время обработки 6кк таких строк:
MinGW - 34c
Cygwin - 11c

запускаю с ключами -O3 -std=c++11

Кто подскажет почему MinGW так тормозит на .c_str(), с чем это может быть связано?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.08.2015, 18:45
Ответы с готовыми решениями:

MinGW очень раздувает код
Всем привет! Скачал MinGW и был очень неприятно удивлён: после компиляции исполняемый файл...

Может ли MinGW x64 компилить приложения x32? Или нужно для этого отдельно ещё MinGW х32 качать?
Просто решил поиграться с CodeLite.

Mingw-w64 MinGW TDM-GCC
Всем привет. Хочу понять, существует ли принципиальная разница между Mingw-w64, MinGW и...

Медленное выполнение запросов
Имеется следующая ситуация: VB-приложение обращается через DAO к БД Access на сетевом диске....

15
Don't worry, be happy
17268 / 10140 / 1963
Регистрация: 27.09.2012
Сообщений: 25,367
Записей в блоге: 1
02.08.2015, 19:00 2
Для начала:
21.4.7 basic_string string operations
21.4.7.1 basic_string accessors


C++
1
2
const charT* c_str() const noexcept;
const charT* data() const noexcept;
1. Returns: A pointer p such that p + i == &operator[](i) for each i in [0,size()].
2. Complexity: constant time.
3. Requires: The program shall not alter any of the values stored in the character array.
0
Заблокирован
02.08.2015, 19:21  [ТС] 3
да, я ошибся, попробовал читать файл через fgets а не через getline, всеравно результаты по времени такие же.

тогда у меня другой вопрос, как быстрее всего разбирать строку на составляющие, если есть текстовый файл:

110970 20000 2015.06.08 09:01:10 1
110960 35000 2015.06.08 09:01:45 1.1
110950 20000 2015.06.08 09:02:05 1.3
где данные хранятся в виде шаблона: <int>/t<int>/t<int>.<int>.<int>/t<int>:<int>:<int>/t<double> каждое из значений которого сохраняется в массив структур.
0
117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
02.08.2015, 20:27 4
iiieoi, перегрузить операцию ввода для класса, который будет содержать переменные для каждой составляющей строки:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class some
{ 
  int one, two, three, four...;
  istream& operator>>(istream& is)
  {
     is >> one >> two >> three;
     is.ignore();
     is >> five;
     ...
     return is;
   }
  ...
};
Разумеется, перегрузка должна быть глобальной дружественной к классу функцией, ну, думаю, разберетесь.
1
Заблокирован
02.08.2015, 20:54  [ТС] 5
tnk500, спасибо за вариант, но по опыту знаю что потоки это далеко не самый быстрый способ.
0
2425 / 1826 / 403
Регистрация: 15.12.2013
Сообщений: 8,003
02.08.2015, 21:05 6
iiieoi, довольно быстрый если грамотно использовать.
https://habrahabr.ru/post/246257/
0
117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
02.08.2015, 21:11 7
iiieoi, что, даже std::ios::sync_with_stdio(0) не улучшает вашего мнения о потоках?
0
Заблокирован
03.08.2015, 00:15  [ТС] 8
Нет, флаг не помогает, в моем случае sscanf оказывается быстрее потоков процентов на 30 по времени.

И непонятно почему код из MinGW почти в три раза медленнее чем Cygwin.
Хотя при работе с vector и list он примерно раза в три быстрее чем Cygwin.

Добавлено через 9 минут
Попробовал загрузку файла запихнуть в dll и скомпилировать Cygwin, а ядро, где будет происходить обработка данных MinGW. В результате программа не может даже строку с именем файла передать в функцию внури dll. Хотя если и само ядро компилировать тоже в Cygwin то проблем не возникает. Это глюк такой или так и должно происходить?

P.S. среда разработки codeblocks, ОС Win7
0
15358 / 8305 / 2015
Регистрация: 30.01.2014
Сообщений: 14,181
03.08.2015, 00:58 9
Цитата Сообщение от iiieoi Посмотреть сообщение
В результате программа не может даже строку с именем файла передать в функцию внури dll
Как эта передача происходит?

Добавлено через 52 секунды
Цитата Сообщение от iiieoi Посмотреть сообщение
Это глюк такой или так и должно происходить?
Скорее всего это происходит из-за различий в ABI и разных библиотек времени исполнения (runtime library) на стороне dll и приложения.

Добавлено через 17 минут
Цитата Сообщение от iiieoi Посмотреть сообщение
попробовал читать файл через fgets а не через getline, всеравно результаты по времени такие же.
Так может сразу fscanf попробовать?
C++
1
fscanf(file, "%d\t%d\t%hu.%hu.%hu\t%hu:%hu:%hu\t%lf", &tmpData.Pip, &tmpData.Tm, &tmpData.Year, &tmpData.Mont, &tmpData.Day, &h, &tmpData.Min, &tmpData.Sec, &tmpData.Spd);
И во временную строку читать не надо будет.
1
Заблокирован
03.08.2015, 13:11  [ТС] 10
DrOffset, спасибо за подсказку про fscanf, действительно использовал С++ и не подумал про С, попробую как приду с работы

а передача происходит так:
программа
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <windows.h>
#include <vector>
 
struct Data{
    int a,
        b,
        c;
};
 
main()
{
    HINSTANCE h;
    vector <Data> vectData; 
    int (*DllFunc) (string * str, vector <Data> * vect);
    h=LoadLibrary("C:\\Project\\test\\ofile.dll");
    string file = "C:\\tt.txt";
    
    if (h) {
        DllFunc=(int (*) (string * str, vector <Data> * vect))GetProcAddress(h,"OpenDataFile");
        if (DllFunc) {
            int n = DllFunc(&file,&vectData);
        };
    };
    FreeLibrary(h);
};
функция загрузки в dll
C++
1
2
3
4
int DLL_EXPORT OpenDataFile(const string * fn, vector <Data> * vectD)
{
    cout >> *fn >> endl;
}
ну и как я и говорил, при использовании одного компилятора и для dll и для программы, в консоль выводится строка переданная в dll, при использовании разных компиляторов ничего не происходит.
0
117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
03.08.2015, 14:28 11
iiieoi, я, конечно, все понимаю, но пожалуйста, не комбинируйте стили программирования на Си и на С++. То приведение указателей как Си, то типы string и vector... Пишите на чем-то одном. Я лично на Си писал бы, раз WinAPI
0
15358 / 8305 / 2015
Регистрация: 30.01.2014
Сообщений: 14,181
03.08.2015, 16:49 12
Цитата Сообщение от iiieoi Посмотреть сообщение
а передача происходит так:
Угу, все понятно. Так нельзя. Между модулями, которые используют разный C++ ABI можно передавать только простые типы.
Вектора, строки т.п. - исключено. То, что это не работает - закономерно и ожидаемо.
0
Заблокирован
03.08.2015, 17:51  [ТС] 13
Цитата Сообщение от DrOffset Посмотреть сообщение
Угу, все понятно. Так нельзя. Между модулями, которые используют разный C++ ABI можно передавать только простые типы.
Вектора, строки т.п. - исключено. То, что это не работает - закономерно и ожидаемо.
Вообщем все оказалось проще, в dll нельзя использовать поток вывода, как только его убрал, все стало хорошо, кстати и сложные типы очень даже неплохо передаются.
0
15358 / 8305 / 2015
Регистрация: 30.01.2014
Сообщений: 14,181
03.08.2015, 18:25 14
Цитата Сообщение от iiieoi Посмотреть сообщение
Вообщем все оказалось проще, в dll нельзя использовать поток вывода, как только его убрал, все стало хорошо, кстати и сложные типы очень даже неплохо передаются.
Не оказалось. Это видимость работы. Игра с UB.
0
Заблокирован
04.08.2015, 18:59  [ТС] 15
Вообщем лучше всего с компилятором MinGW себя показала привязка потока stdin к файлу через freopen(), а затем использование getchar() + свой парсер.

Хотя мне до сих пор не ясно из-за чего может быть такое различие в скорости работы компиляторов, слишком я пока слабо представляю их работу (все эти lib, include и т.д, которые ставятся вместе с компиляторами).
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
04.08.2015, 19:11 16
Dll должна собираться с той же конфигурацией (debug/release) что и использующий её exe. Иначе стандартные классы начнут выпендриваться.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.08.2015, 19:11

Медленное выполнение цикла
Приветствую! Такой вопрос: создал поток, в нем бесконечный цикл, увеличивающий число на 1. Но...

Потоки [медленное выполнение]
Код в главной форме выполняется за секунд 10, тогда как в дополнительном потоке(1 или нескольких...

SQLite медленное выполнение оперетора LIKE
Добрй день! Есть запроc: SELECT * FROM Book WHERE Name LIKE 'test%' Так вот этот запрос...

Медленное выполнение авторизации ВКонтакте
Имеется следующий код для авторизации ВКонтакте: $client_id = 'здесь ID'; // ID приложения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru