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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Медленное чтение файла (gcc, Unix)  (Прочитано 6636 раз)
starab
Гость
« : Апрель 29, 2011, 08:57 »

Проект с Qt4.2 собрал на MSVC WinXP/Core 2 Duo, потом перенес на gcc Unix-X11/Nehalem. Вижу по бегущей шкале, что файлы версия на Unix читаются медленнее. Возможно замедляются вообще все действия кода, но критично это именно на чтении файла. Если Qt-эшный интерфейс отключить и собрать на двух машинах, то чтение на Nehalem проходит в несколько раз быстрее.
Есть ли у кого-нибудь версии?
Возможно можно остановить обработку событий в Qt, как это сделать?
Может быть я не учел каких-то особенностей перенесения на Unix?

Код на Linux нужен для работы с большими объемами. Так что готов проверять, компилировать кусками, переписывать чтение. Лишь бы только были идеи, как это делать. Скажем fscanf я заменил на построчное считывание через fgets и sscanf, опции компиляции менял -- не помогает.

Заранее благодарен вашим ответам.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Апрель 29, 2011, 09:14 »

Цитировать
Вижу по бегущей шкале, что файлы версия на Unix читаются медленнее.
Что такое "бегущая шкала"? Прогресс бар?
Записан

Qt 5.11/4.8.7 (X11/Win)
Fat-Zer
Гость
« Ответ #2 : Апрель 29, 2011, 09:18 »

а может это какие-то тормоза дисковой подсистемы вообще?

ЗЫ: чтение же в отдельном потоке идёт?
Записан
starab
Гость
« Ответ #3 : Апрель 29, 2011, 09:22 »

Да, прогресс бар.
Немного повторюсь - Чтобы проверить скорость чтения я запускал чтение файла на обоих системах. На Unix быстрее. Когда запускаю QApplication с чтением внутри конструктора, чтение на Unix происходит медленее.

Я в коде чтение в отдельную нить не выношу, никогда не пробовал это делать.
Если чтение файла выносится в отдельную нить, то могу ли я повысить приоритет этой нити, или понизить приоритет других нитей???
« Последнее редактирование: Апрель 29, 2011, 09:24 от starab » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Апрель 29, 2011, 09:26 »

Цитировать
Когда запускаю QApplication с чтением внутри конструктора, чтение на Unix происходит медленее.
По каким критериям вы это оцениваете?
Записан

Qt 5.11/4.8.7 (X11/Win)
Fat-Zer
Гость
« Ответ #5 : Апрель 29, 2011, 09:34 »

Да, прогресс бар.
Немного повторюсь - Чтобы проверить скорость чтения я запускал чтение файла на обоих системах. На Unix быстрее. Когда запускаю QApplication с чтением внутри конструктора, чтение на Unix происходит медленее.

Я в коде чтение в отдельную нить не выношу, никогда не пробовал это делать.
Если чтение файла выносится в отдельную нить, то могу ли я повысить приоритет этой нити, или понизить приоритет других нитей???
как часто обновляете прогрессбар? скорей всего тормозит именно его постоянное обновление/переотрисовка.
ЗЫ: внутри какого конструктора? выложите немного кода...
« Последнее редактирование: Апрель 29, 2011, 09:37 от Fat-Zer » Записан
starab
Гость
« Ответ #6 : Апрель 29, 2011, 09:45 »

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

Код:
        pr_bar=pr_bar_;	label_operation=label_operation_;

FILE* f=fopen(fname,"r");

if(f==NULL) { dg=NULL; return; }

char str[400];
fgets( str, 400, f );
sscanf( str, "%d %d %d", N+2, N+1, N );
//N[2]=N[1]=700; N[0]=708; ///!!!!!!!!!
//if(DIM<3) N[2]=1; if(N[1]<=0) N[1]=N[0]; if(N[2]<=0) N[2]=N[1];

// int temp_upsc=1,tu3=temp_upsc*temp_upsc*temp_upsc; N[0]/=temp_upsc; N[0]/=temp_upsc; N[0]/=temp_upsc;

this->chmap=NULL; this->pres=NULL;

int Nt=GetSize();

if(Nt<=0) { dg=NULL; return; }

this->dg = new int[Nt];   memset(dg,inv,Nt);

int ijk[3],i_,j_,k_; int cnt=0;
int iperm=0; //index with permutation
FILE* fff=fopen("LogLoad","w");
fprintf(fff,"%d %d %d %d\n",N[0],N[1],N[2],Nt);
for( int i=0; i<Nt; i++ )
{
if(feof(f)) break;
i_=i/N[2]/N[1]; j_=(i/N[2])%N[1]; k_=i%N[2];
iperm=N[0]*N[1]*k_+N[0]*j_+i_;
fscanf( f, "%d", dg+iperm );
dg[iperm]=!!dg[iperm];
cnt+=dg[iperm];
//dg[i]=!dg[i]; //inverting for more interesting tests

//if(i>0.15*Nt) break;

if(i%500==0)
{
fprintf(fff,"%d,%d where dg=[%d]\n",i,iperm,dg[iperm]);
SetProgress((int)(i*100./Nt),"Loading index...");
}
}
fclose(fff);
Записан
starab
Гость
« Ответ #7 : Апрель 29, 2011, 09:51 »

Цитировать
Когда запускаю QApplication с чтением внутри конструктора, чтение на Unix происходит медленее.
По каким критериям вы это оцениваете?
Я запускаю Unix-версию удаленно и отображаю через Xming, а WinXP-версия работает на моей машине. Для тестового небольшого файла WinXP-версия работает в 4 раза быстрее. А если интерфейса нет, то читается все мгновенно, но по засечкам с clock() я вижу, что в Unix чтение проходит за 0.8 сек против 2.7 сек в Windows.
Записан
Fat-Zer
Гость
« Ответ #8 : Апрель 29, 2011, 09:59 »

Под WinXP я вызываю прогресс бар столько же раз. И вижу что шкала бежит быстрее, чем на Unix.
И есть еще один эффект. Программа в памяти не увеличивается, но чем больше она прочитала, тем медленее идет чтение....
Ну а если закоментировать весь блок(или строчку с SetProgress):
Код:
if(i%500==0)
                {
                        fprintf(fff,"%d,%d where dg=[%d]\n",i,iperm,dg[iperm]);
                        SetProgress((int)(i*100./Nt),"Loading index...");
                }
        }
то скорость чтения остаётся порядка 1c.?
Записан
starab
Гость
« Ответ #9 : Апрель 29, 2011, 10:04 »

Кстати, нет. Порядка минуты. Т.е. интерфейс получается сильно тормозит чтение на обеих системах.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #10 : Апрель 29, 2011, 10:52 »

Цитировать
Я запускаю Unix-версию удаленно и отображаю через Xming, а WinXP-версия работает на моей машине.
Ну дык, конечно, gui в этом случае может сильно тормозить.
Мой вам совет - первичная оценка скорости должна делаться локально. Иначе можете устроить войну с ветряными мельницами.
Записан

Qt 5.11/4.8.7 (X11/Win)
starab
Гость
« Ответ #11 : Апрель 29, 2011, 11:07 »

Не совсем понял.
Я оценивал скорость файла и скорость файла при запуске QtApplication. Какую еще оценку мне сделать?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #12 : Апрель 29, 2011, 11:12 »

Оценивать нужно локально, а не удалённо. И только после такой оценки делать выводы.
Записан

Qt 5.11/4.8.7 (X11/Win)
Fat-Zer
Гость
« Ответ #13 : Апрель 29, 2011, 11:30 »

starab, ну дык при указанных закоментированных  строках скорость нормальная?
Записан
starab
Гость
« Ответ #14 : Апрель 29, 2011, 11:58 »

Нет, порядка минуты на Win и 4 минут на Unix.

Точнее отвечу, комментирование строчек ускоряет код на 10% не больше, под любой системой.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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