Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: starab от Апрель 29, 2011, 08:57



Название: Медленное чтение файла (gcc, Unix)
Отправлено: 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, опции компиляции менял -- не помогает.

Заранее благодарен вашим ответам.


Название: Re: Медленное чтение файла (gcc, Unix)
Отправлено: GreatSnake от Апрель 29, 2011, 09:14
Цитировать
Вижу по бегущей шкале, что файлы версия на Unix читаются медленнее.
Что такое "бегущая шкала"? Прогресс бар?


Название: Re: Медленное чтение файла (gcc, Unix)
Отправлено: Fat-Zer от Апрель 29, 2011, 09:18
а может это какие-то тормоза дисковой подсистемы вообще?

ЗЫ: чтение же в отдельном потоке идёт?


Название: Re: Медленное чтение файла (gcc, Unix)
Отправлено: starab от Апрель 29, 2011, 09:22
Да, прогресс бар.
Немного повторюсь - Чтобы проверить скорость чтения я запускал чтение файла на обоих системах. На Unix быстрее. Когда запускаю QApplication с чтением внутри конструктора, чтение на Unix происходит медленее.

Я в коде чтение в отдельную нить не выношу, никогда не пробовал это делать.
Если чтение файла выносится в отдельную нить, то могу ли я повысить приоритет этой нити, или понизить приоритет других нитей???


Название: Re: Медленное чтение файла (gcc, Unix)
Отправлено: GreatSnake от Апрель 29, 2011, 09:26
Цитировать
Когда запускаю QApplication с чтением внутри конструктора, чтение на Unix происходит медленее.
По каким критериям вы это оцениваете?


Название: Re: Медленное чтение файла (gcc, Unix)
Отправлено: Fat-Zer от Апрель 29, 2011, 09:34
Да, прогресс бар.
Немного повторюсь - Чтобы проверить скорость чтения я запускал чтение файла на обоих системах. На Unix быстрее. Когда запускаю QApplication с чтением внутри конструктора, чтение на Unix происходит медленее.

Я в коде чтение в отдельную нить не выношу, никогда не пробовал это делать.
Если чтение файла выносится в отдельную нить, то могу ли я повысить приоритет этой нити, или понизить приоритет других нитей???
как часто обновляете прогрессбар? скорей всего тормозит именно его постоянное обновление/переотрисовка.
ЗЫ: внутри какого конструктора? выложите немного кода...


Название: Re: Медленное чтение файла (gcc, Unix)
Отправлено: starab от Апрель 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);


Название: Re: Медленное чтение файла (gcc, Unix)
Отправлено: starab от Апрель 29, 2011, 09:51
Цитировать
Когда запускаю QApplication с чтением внутри конструктора, чтение на Unix происходит медленее.
По каким критериям вы это оцениваете?
Я запускаю Unix-версию удаленно и отображаю через Xming, а WinXP-версия работает на моей машине. Для тестового небольшого файла WinXP-версия работает в 4 раза быстрее. А если интерфейса нет, то читается все мгновенно, но по засечкам с clock() я вижу, что в Unix чтение проходит за 0.8 сек против 2.7 сек в Windows.


Название: Re: Медленное чтение файла (gcc, Unix)
Отправлено: Fat-Zer от Апрель 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.?


Название: Re: Медленное чтение файла (gcc, Unix)
Отправлено: starab от Апрель 29, 2011, 10:04
Кстати, нет. Порядка минуты. Т.е. интерфейс получается сильно тормозит чтение на обеих системах.


Название: Re: Медленное чтение файла (gcc, Unix)
Отправлено: GreatSnake от Апрель 29, 2011, 10:52
Цитировать
Я запускаю Unix-версию удаленно и отображаю через Xming, а WinXP-версия работает на моей машине.
Ну дык, конечно, gui в этом случае может сильно тормозить.
Мой вам совет - первичная оценка скорости должна делаться локально. Иначе можете устроить войну с ветряными мельницами.


Название: Re: Медленное чтение файла (gcc, Unix)
Отправлено: starab от Апрель 29, 2011, 11:07
Не совсем понял.
Я оценивал скорость файла и скорость файла при запуске QtApplication. Какую еще оценку мне сделать?


Название: Re: Медленное чтение файла (gcc, Unix)
Отправлено: GreatSnake от Апрель 29, 2011, 11:12
Оценивать нужно локально, а не удалённо. И только после такой оценки делать выводы.


Название: Re: Медленное чтение файла (gcc, Unix)
Отправлено: Fat-Zer от Апрель 29, 2011, 11:30
starab, ну дык при указанных закоментированных  строках скорость нормальная?


Название: Re: Медленное чтение файла (gcc, Unix)
Отправлено: starab от Апрель 29, 2011, 11:58
Нет, порядка минуты на Win и 4 минут на Unix.

Точнее отвечу, комментирование строчек ускоряет код на 10% не больше, под любой системой.


Название: Re: Медленное чтение файла (gcc, Unix)
Отправлено: Fat-Zer от Апрель 29, 2011, 12:10
Нет, порядка минуты на Win и 4 минут на Unix.

Точнее отвечу, комментирование строчек ускоряет код на 10% не больше, под любой системой.
странно :-\