LINUX.ORG.RU

[C++/Qt] Мистика с QTime


0

0

Дали простенькое задание - написать сравнение алгоритмов сортировки.
Писал на C++/Qt4. И столкнулся с необъяснимым: при замере времени исполнения алгоритма с помощью QTime.start() [алгоритм] QTime.elapsed() если ставить чекбокс, чтобы выводить элементы массива в QListWidget'ы - засеченное время сокращается примерно на 30-40 мс (или меньше, в зависимости от размера массива).

код


void main_form::start()
{
int arraySize = spinBox->value();
int *mas = new int[arraySize];
qsrand(QDateTime::currentDateTime().toTime_t());

for(int i=0; i<arraySize; i++)
mas[i]=qrand()%10000;

int elapsedTime = 0;
QString sortName;

listWidget->clear();
listWidget_2->clear();

if(checkBox->checkState()==Qt::Checked)
for(int i=0; i<arraySize; i++)
{
new QListWidgetItem(QString::number(mas[i]),listWidget);
}
QTime time;

//DEBUG
qDebug()<<"Start: " << time.currentTime().toString("hh:mm:ss.zzz");


//ВОТ ТУТ ЗАСЕКАЮ

time.start();
switch(comboBox->currentIndex())
{
case 0: sortName = tr("Бульбашка");
bubbleSort(mas, arraySize);
break;
case 1: sortName = tr("Метод вставок");
insertionSort(mas, arraySize);
break;
case 2: sortName = tr("Метод Хоара");
quickSort(mas, 0, arraySize-1);
break;
}


//И ТУТ ПОЛУЧАЮ ВРЕМЯ ИСПОЛНЕНИЯ

elapsedTime = time.elapsed();

//DEBUG
qDebug()<<"Finish: " << time.currentTime().toString("hh:mm:ss.zzz");
if(checkBox->checkState()==Qt::Checked)
for(int i=0; i<arraySize; i++)
{
new QListWidgetItem(QString::number(mas[i],10),listWidget_2);
}
tableWidget->setSortingEnabled(false);
tableWidget->insertRow(tableWidget->rowCount());

QTableWidgetItem* newItemName = new QTableWidgetItem(sortName);
QTableWidgetItem* newItemCount = new QTableWidgetItem(QString::number(arraySize));
QTableWidgetItem* newItemTime = new QTableWidgetItem(QString::number(elapsedTime));
if(elapsedTime==0)elapsedTime=1;
QTableWidgetItem* newItemTimePerSec = new QTableWidgetItem(QString::number(arraySize/elapsedTime));

tableWidget->setItem(tableWidget->rowCount()-1, 0, newItemName);
tableWidget->setItem(tableWidget->rowCount()-1, 1, newItemCount);
tableWidget->setItem(tableWidget->rowCount()-1, 2, newItemTime);
tableWidget->setItem(tableWidget->rowCount()-1, 3, newItemTimePerSec);

tableWidget->setSortingEnabled(true);
}

В чём загвоздка?

Что то я не совсем понял а каком чекбоксе речь. Какой именно блок кода он включает/выключает? Не вижу вывод этого time.elapsed(), только QTime::currentTime() (кстати, так и нужно писать, а не time.currentTime()). И ещё у вас бардак с трансляцией, видно вы не совсем поняли как она в Qt работает. В tr() нужно подставлять исключительно латинскую строку, для которой tr() вернёт перевод уже в рантайме.

Dendy ★★★★★
()
Ответ на: комментарий от Dendy

time.elapsed() передается переменной elapsedTime:
elapsedTime = time.elapsed();
которую вывожу в QTableWidgetItem
QTableWidgetItem* newItemTime = new TableWidgetItem(QString::number(elapsedTime));

А проверка состояния чекбокса происходит в этих участках кода.

if(checkBox->checkState()==Qt::Checked)
for(int i=0; i<arraySize; i++)
{
new QListWidgetItem(QString::number(mas[i]),listWidget);
}

и

if(checkBox->checkState()==Qt::Checked)
for(int i=0; i<arraySize; i++)
{
new QListWidgetItem(QString::number(mas[i],10),listWidget_2);
}

И хоть они _вне_ засекаемого куска, их исполнение влияет на показатели QTime. Спасибо за замечания по tr() и статик-методе QTime.

Chaser_Andrey ★★★★★
() автор топика
Ответ на: комментарий от Dendy

> В tr() нужно подставлять исключительно латинскую строку

Бред. На каком языке удобнее писать разработчику - такие строки и нужно "подставлять". Кодировку можно установить с помощью QTextCodec::setCodecForTr()

mannaz
()
Ответ на: комментарий от Chaser_Andrey

Да, действительно, непонятное поведение. Единственное что должно влиять на скорость - содержимое сортировки массива. Без полного кода программы подсказать не смогу. Кстати, у вас утечка памяти, mas не уничтожается, рекомендую использовать QVector<int>.

P.S. Комментарий господина mannaz рекомендую пропустить мимо ушей.

Dendy ★★★★★
()
Ответ на: комментарий от mannaz

> why?

Потому что код пишется не для себя, а для потенциального китайца, который заглянет в него через 5 лет. А то можно и так писать:

for ( int VasyaPupkin = 0; VasyaPupkin < Bethoven; VasyaPupkin++ )

Dendy ★★★★★
()
Ответ на: комментарий от Dendy

> Дали простенькое задание - написать сравнение алгоритмов сортировки.

> Потому что код пишется не для себя, а для потенциального китайца


Ага

mannaz
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.