Russian Qt Forum
Ноябрь 26, 2024, 02:19 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 ... 3 4 [5]   Вниз
  Печать  
Автор Тема: Тормоза в Qt IO  (Прочитано 36926 раз)
Tonal
Гость
« Ответ #60 : Январь 13, 2010, 08:57 »

Если тебе не критично сохранить старый формат, то просто используй QDataStream. Улыбающийся
Если таки критичен, то не забывай, что в С++ память нужно освобождать и работа с ней по выделению/освобождению несколько медленнее чем в шарпе.

Код
C++ (Qt)
QString readString(QFile& f, int count) {
return QString(f.read(count)).trimmed();
}
 
void readFloatbuffer(QFile &f, float*  f_buffer, int len) {
f.read((char*)f_buffer, len * sizeof(*f_buffer));
}
 
void readInt32buffer(QFile &f, int*  i_buffer, int len) {
f.read((char*)i_buffer, len * sizeof(*i_buffer));
}
 
int readInt32(QFile &f) {
return f.read(sizeof(int)).toInt();
}
 
float readFloat(QFile &f) {
return f.read(sizeof(float)).toFloat();
}
...
 
Дальше код править заломало. Улыбающийся
« Последнее редактирование: Январь 13, 2010, 09:26 от Dendy » Записан
Tonal
Гость
« Ответ #61 : Январь 13, 2010, 09:22 »

Ну и читать конечно нужно не по интику и фловтику а сразу блоком, который потом уже и разбирать. Улыбающийся
Записан
romank
Гость
« Ответ #62 : Январь 13, 2010, 10:29 »

Спасибо, всем ещё раз.
Да всё правильно, читать надо большим блоком и разбирать уже в памяти. Здесь частично такое используется за счет readInt32buffer, читаются небольшие буфера. Перейдем на мапинг, чего там.
Интересно получается, предложенные рекомендации (в отдельный класс вынести чтение и другие) посадили производительность C# в ракету и запустили на Марс. Для С++ это всё полумеры, основное падение производительности связано именно со скоростью IO (скорость движения танковой колоны равна скорости движения самого медленного танка), поэтому все inline и прочие "оптимизации" памяти прироста не дают. Впечатление что .NET хоть и написан на C++ к файловой системе подходит с более нежной стороны, может в потрохах своих чего и мапит, ничего нагуглить не получилось.
Принципиально хотелось сравнить как один и тот-же механизм работает на C++ и C#.

Видимо писать здесь больше не о чем, поэтому скажу не по теме. В соседних ветках кто-то сравнивал .NET и Qt, у меня есть небольшой жопыт и там и там, что можно сказать.
.NET я люблю за C#, но презираю за WindowForms, Qt я люблю за GUI, но ненавижу за C++.
Больше всего C++ я ненавижу за перечисления !!! Если в C# писать под OpenGL это одно удовольствие, то под C++ это постоянное смотрение в superbible, а какие же там флаги на самом деле.
Писали что Assistent лучше чем MSDN. Может быть и лучше, но количество обращений к документации в C++(Qt) намного больше чем к MSDN. C# (а наверно больше VS) имеет достаточные средства самодокументирования, нет необходимости прибегать к отдельным справочникам, многое о классе можно узнать из кода.
Но вот скорость WindowForms это просто невозможно смотреть без боли. Я делал паузу в полгода чтобы дождаться выпуска .NET4.0, задумывался о WPF. И что получается. Под WinXP WPF уродлив, чтобы не говорили про возможности. Этот гребанный дрожащий фонт раздражает глаза, такая мелочь, но так неприятно. Именно за фонты я ненавижу и GUI+. Где мой родной cleartype который я не могу повторить в gui+, wtf?

А за красоту и скорость можно полюбить и черта лысого. Поэтому, отставить колебания, упереться рогом и ползти. Благо есть интернет, есть src и есть вы - добрые и отзывчивые люди.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #63 : Январь 13, 2010, 17:22 »

насчет мсдн - вы видимо не сильно извращались... дефолтные значения работают на ура - а скорми тому же фс вотчеру 3000 файлов и посмотри что будет. А потом натрави его на сетевой фолдер... и покажи мне место в мсдне где написано что с ним не так... я к счастью нашел... но программирование методо гугла не интересно:) В ассистанте, как правило нюансы все-таки описаны. Да в c++ многое более низкоуровнево и потому нетривиально на 1й взгляд. Но если подумать о том, как бы ты реализовыал сам, то многое становится на свои места:)
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #64 : Январь 13, 2010, 21:48 »

Впечатление что .NET хоть и написан на C++ к файловой системе подходит с более нежной стороны, может в потрохах своих чего и мапит, ничего нагуглить не получилось.
Тут IMHO все довольно логично - MS строит новый интерпретируемый фреймворк, который жестко завязан на одну ОС, на него надо пересадить большое количество разработчиков - отсюда надо доказывать, что код .Net может быть производительнее УНИВЕРСАЛЬНОГО языка высокого уровня в случае работы, например, с файлами большого объема. Что бы делал я на месте разработчика .Net? В первую очередь, зная о существенном ускорении файловых операций для файлов больших размеров в Windows за счет mapping, при открытии такого файла тупо делал бы map. Для .Net разработчика этот механизм скрыт и существенная часть из них может просто сделать "логичный" вывод - ".Net быстрее C++".
Записан
romank
Гость
« Ответ #65 : Январь 13, 2010, 23:17 »

Поэтому и задавал первый вопрос.

Tonal
Код
C++ (Qt)
QString readString(QFile& f, int count) {
return QString(f.read(count)).trimmed();
}
 
Это сработает, если строки zero-null terminated. В моем случае это не так

Код
C++ (Qt)
int readInt32(QFile &f) {
return f.read(sizeof(int)).toInt();
}
 
Это фактически перевод из StringToInt. У меня четыре байта это не текст, это целочисленное или с плавающей запятой число.

xokc под .net мне было достаточно скорости. Я вообще не знаком ни с одним программистом, но мне кажется что .net разработчик не глупее обычного. По крайне мере я знаком с file mapping(у Рихтера было разжевано), но никогда не использовал (это я пытаюсь оправдать себя). Под .net не скрыто, можно делать CreateFileForMapping и так далее.
Понятно что я не могу покрывать сто процентов возможностей (сети и базы это мимо меня), но я не вижу никакой разницы между .net и qt. Везде я нахожу уже готовые полезные классы. Красивые оба. После прихода nokia qt стал ещё лучше.

В чем плюс, точнее два плюса от cpp это разнообразие философии - ты можешь придумать свой круг понимания языка. Например, можно писать программы и без указателей. Можно (но недолго) без ООП. Я замыкаюсь в рамках qt-классов и пишу в стиле C#, если не смотреть на объявление классов а только на реализации - визуально разница в коде процентов 2-3% (немного по другому работа с массивами). Так что переход с C# на C++(Qt) весьма быстрый. Недавно писали что под C# надо писать в два раза больше кода. Ерунда, никакой разницы.

Записан
Tonal
Гость
« Ответ #66 : Январь 15, 2010, 13:45 »

Это сработает, если строки zero-null terminated. В моем случае это не так
Да, хотя это и странно - в QByteArray длинна присутствует явно. Тогда так.
Код
C++ (Qt)
QString readString(QFile& f, int count) {
 return QString::fromAscii(f.read(count).constData(), count).trimmed();
}

Код
C++ (Qt)
int readInt32(QFile &f) {
 return f.read(sizeof(int)).toInt();
}
Это фактически перевод из StringToInt. У меня четыре байта это не текст, это целочисленное или с плавающей запятой число.
Да, ступил. Улыбающийся
Здесь действительно локальная переменная будет правильно. Улыбающийся

Да, надеюсь ты тестируешь скорость не на отладочных версиях?

Ну и насчёт писать больше/меньше - на С++ действительно можно писать меньше чем на C# если использовать его преимущества. Улыбающийся
Правда для этого его нужно таки знать. Улыбающийся
А если писать на С с классами, то действительно никакой разницы.
Записан
Страниц: 1 ... 3 4 [5]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.182 секунд. Запросов: 23.