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

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

Страниц: 1 [2] 3 4   Вниз
  Печать  
Автор Тема: Отправка сообщений по протоколу SMTP  (Прочитано 46266 раз)
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #15 : Сентябрь 10, 2010, 09:24 »

З.Ы. Это относится к данному конкретному коду, а не к высказыванию о массовости memory licks от navrocky. Хотя в целом не так уж он и неправ. 

Почему же не прав Улыбающийся
У меня большой проект, все свои ошибки работы с памятью я полечил (на мой код valgrind не ругается и все ошибки которые я нашел были по существу), однако у меня есть большой файл подавлений ошибок системных библиотек, и Qt в их числе...

Например, первое что попалось (qt 4.6.2):
Код:
src/gui/widgets/qdockarealayout.cpp:1936
>>> QDockAreaLayoutItem item(new QDockWidgetItem(widget));
Явная утечка, QDockAreaLayoutItem не освобождает его потом...

И так во многих системных библиотеках, в бусте, в ld.so и так далее.
Записан

Гугль в помощь
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #16 : Сентябрь 12, 2010, 14:49 »

тут передается виджет как параметр в конструкторе и ятп что док виджет айтем будет удален при удалении виджета
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


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

тут передается виджет как параметр в конструкторе и ятп что док виджет айтем будет удален при удалении виджета

QDockWidgetItem -> QWidgetItem -> QLayoutItem

Не наследник QObject, автоматическое удаление не работает. Просмотри их конструкторы, там нигде нет регистрации у widget.. И оно конечно течет.
Записан

Гугль в помощь
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #18 : Сентябрь 13, 2010, 10:49 »

то, что не используется механизм родства куобжектов, не означает, что нет удаления руками. Настолько тупых ошибок в qt нет
Записан
SABROG
Гость
« Ответ #19 : Сентябрь 13, 2010, 13:23 »

QMF пробовали?
Записан
ритт
Гость
« Ответ #20 : Сентябрь 13, 2010, 15:19 »

Код
C++ (Qt)
QString::fromLatin1( "From: " ) + p_mail_From+QString::fromLatin1( "\nTo: " ) + p_mail_to +QString::fromLatin1( "\nSubject: ") + subject +QString::fromLatin1( "\n\n" ) + body +"\n";
 

Этож песец так писать.. Не удержался ) Рекомендую глянуть в сторону функции QString::arg

Код
C++ (Qt)
QString( "From: %1\nTo: %2\nSubject: %3\n\n%4\n" ).arg(p_mail_From).arg(p_mail_to).arg(subject).arg(body);
 

ой, не надо советовать херню Улыбающийся
ваше QString( "From: %1\nTo: %2\nSubject: %3\n\n%4\n" ).arg(p_mail_From).arg(p_mail_to).arg(subject).arg(body); в разы медленнее перегруженного +=
а вот QString::fromLatin1() я бы заменил на QLatin1String() - для наглядности...
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #21 : Сентябрь 14, 2010, 11:36 »

Цитировать
ой, не надо советовать херню Улыбающийся

Это не "херня". Если код не критичен к скорости исполнения (в данном случае это так), то format предпочтительнее, так как более наглядно и компактно выглядит, позволяет отформатировать вставляемые значения, поддается переводу.

Так что не надо ля-ля...  Злой

ЗЫЖ QLatinXXX здесь в любом случае лишний, т.к. в его коде нет специфичных для Latin-1 символов. И вообще в исходники должны быть в UTF-8 и строки грузиться через tr() и QString::fromUtf8
Записан

Гугль в помощь
ufna
Гость
« Ответ #22 : Сентябрь 14, 2010, 11:43 »

Так, а реально ::fromLatin1(..) быстрее чем .arg() пихать? Сильная разница?
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #23 : Сентябрь 14, 2010, 12:19 »

Цитировать
Так, а реально ::fromLatin1(..) быстрее чем .arg() пихать? Сильная разница?

Я вот даже отвлекся и написал тест:
Код
C++ (Qt)
void test_various::test_plus_vs_format()
{
   int cnt = 1000000;
 
   QString res;
   QString p_mail_From = "mail@gavgav.ru";
   QString p_mail_to = "mail@gavgav.ru";
   QString subject = "My cool mega subject";
   QString body = QString("Body message ").repeated(10);
 
   LOG_DEBUG << "Started QString PLUS operator. Total %1 iterations", cnt;
   for (int i = 0; i < cnt; i++)
   {
       res = "From: " + p_mail_From + "\nTo: " + p_mail_to + "\nSubject: " +
               subject + "\n\n" + body + "\n";
   }
   LOG_DEBUG << "Finished plus";
 
   LOG_DEBUG << "Started QString .arg() function. Total %1 iterations", cnt;
   for (int i = 0; i < cnt; i++)
   {
       res = QString("From: %1\nTo: %2\nSubject: %3\n\n%4\n").arg(p_mail_From)
               .arg(p_mail_to).arg(subject).arg(body);
   }
   LOG_DEBUG << "Finished arg()";
}
 

Собирал релиз с оптимизаций -O2.

Результат тестирования:
Код:
2010-Sep-14 13:14:04.882129 D:    72 TH:0 (dbg )1 syslog: Thread #0 with id=0x83358e0
2010-Sep-14 13:14:04.882129 D:    72 TH:0 (dbg )1 test_various: Started QString PLUS operator. Total 1000000 iterations
2010-Sep-14 13:14:06.954295 D:2072166 TH:0 (dbg )1 test_various: Finished plus
2010-Sep-14 13:14:06.954465 D:   170 TH:0 (dbg )1 test_various: Started QString .arg() function. Total 1000000 iterations
2010-Sep-14 13:14:08.726525 D:1772060 TH:0 (dbg )1 test_various: Finished arg()
Смотрим поле D: - это разница в микросекундах от предыдущей записи в лог. Видим что вариант с плюсом выполнялся 2072 ms, а вариант с .arg() 1772 ms.

Выводы делайте сами Подмигивающий
Записан

Гугль в помощь
Kolobok
Гость
« Ответ #24 : Сентябрь 14, 2010, 12:52 »

Не совсем корректно. Попробуй добавить в тест изменяемый стринг. Например QString::number(i)
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #25 : Сентябрь 14, 2010, 13:10 »

Код
C++ (Qt)
void test_various::test_plus_vs_format()
{
   int cnt = 1000000;
 
   QString res;
   QString p_mail_From = "mail@gavgav.ru";
   QString p_mail_to = "mail@gavgav.ru";
   QString subject = "My cool mega subject";
   QString body = QString("Body message ").repeated(10);
 
   LOG_DEBUG << "Started QString PLUS operator. Total %1 iterations", cnt;
   for (int i = 0; i < cnt; i++)
   {
       QString s_int = QString::number(i);
       res = "From: " + p_mail_From + "\nTo: " + p_mail_to + "\n" + s_int + "Subject: " +
               subject + "\n\n" + body + "\n";
   }
   LOG_DEBUG << "Finished plus";
 
   LOG_DEBUG << "Started QString .arg() function. Total %1 iterations", cnt;
   for (int i = 0; i < cnt; i++)
   {
       QString s_int = QString::number(i);
       res = QString("From: %1\nTo: %2\n%3Subject: %4\n\n%5\n").arg(p_mail_From)
               .arg(p_mail_to).arg(s_int).arg(subject).arg(body);
   }
   LOG_DEBUG << "Finished arg()";
}
 

Код:
2010-Sep-14 14:08:07.448952 D:    71 TH:0 (dbg )1 syslog: Thread #0 with id=0x8718bb8
2010-Sep-14 14:08:07.448952 D:    71 TH:0 (dbg )1 test_various: Started QString PLUS operator. Total 1000000 iterations
2010-Sep-14 14:08:10.661427 D:3212475 TH:0 (dbg )1 test_various: Finished plus
2010-Sep-14 14:08:10.661596 D:   169 TH:0 (dbg )1 test_various: Started QString .arg() function. Total 1000000 iterations
2010-Sep-14 14:08:13.565228 D:2903632 TH:0 (dbg )1 test_various: Finished arg()

3212 ms против 2903 ms. Опять же победа за .arg()..
Записан

Гугль в помощь
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #26 : Сентябрь 14, 2010, 13:49 »

проверьте на длинных строках - чтобы было много переалокаций
Записан
Kolobok
Гость
« Ответ #27 : Сентябрь 14, 2010, 13:53 »

У меня другие результаты
Код:
int cnt = 1000000;

 QString res;
 QString p_mail_From = "mail@gavgav.ru";
 QString p_mail_to = "mail@gavgav.ru";
 QString subject = "My cool mega subject";
 QString body = QString("Body message ").repeated(10);
 QTime time;


 qDebug() << "Started QString .arg() function. Total iterations" << cnt;
 time.start();
 for (int i = 0; i < cnt; i++)
 {
     res = QString("From: %1\nTo: %2\nSubject: %3\n\n%4\n%5").arg(p_mail_From)
             .arg(p_mail_to).arg(subject).arg(body).arg(QString::number(i));
 }
 qDebug() << "Finished arg()" << time.elapsed();
 qDebug() << "Started QString PLUS operator. Total iterations" << cnt;
 time.restart();
 for (int i = 0; i < cnt; i++)
 {
     res = "From: " + p_mail_From + "\nTo: " + p_mail_to + "\nSubject: " +
           subject + "\n\n" + body + "\n" + QString::number(i);
 }
 qDebug() << "Finished plus" << time.elapsed();

Цитировать
Started QString .arg() function. Total iterations 1000000
Finished arg() 8641
Started QString PLUS operator. Total iterations 1000000
Finished plus 6665
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #28 : Сентябрь 14, 2010, 14:55 »

У меня другие результаты

Странно. Какая система?
У меня AthlonX4, OpenSuse11.2 32bit, gcc 4.4.1, Qt 4.6.2.
Записан

Гугль в помощь
Kolobok
Гость
« Ответ #29 : Сентябрь 14, 2010, 15:21 »

Intel Core2 Duo, Win7, gcc 4.4.0, Qt 4.7
Записан
Страниц: 1 [2] 3 4   Вверх
  Печать  
 
Перейти в:  


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