Russian Qt Forum

Программирование => С/C++ => Тема начата: kuzulis от Март 05, 2010, 09:35



Название: Методы оптимизации исходного кода
Отправлено: kuzulis от Март 05, 2010, 09:35
Доброго времени суток!

Скажите, стоит ли оптимизировать это:
№1
Код:
void myFun()
{
...
qDebud() << "myFun() -> Error1. \n";
...
qDebud() << "myFun() -> Error2. \n";
...
qDebud() << "myFun() -> ErrorN. \n";
}

на:
№2
Код:
void myFun()
{
static const char[] dbgStr = "myFun() -> ";
...
qDebud() << dbgStr  << "Error1. \n";
...
qDebud() << dbgStr  << "Error2. \n";
...
qDebud() << dbgStr  << "ErrorN. \n";
}

И будет ли вообще при этом какая-либо "оптимизация" ? Хотя бы по скорости выполнения, т.к. при варианте №2 размер скомпилированного винарика получается больше чем при №1

:)


Название: Re: Методы оптимизации исходного кода
Отправлено: Rcus от Март 05, 2010, 09:55
Оптимизировать отладочный вывод? хм...
По поводу скорости достаточно посмотреть как это реализовано (если qDebud это что-то типа qDebug).
Код:
    inline QDebug &operator<<(const char* t) { stream->ts << QString::fromAscii(t); return maybeSpace(); }


Название: Re: Методы оптимизации исходного кода
Отправлено: Akaiten от Март 05, 2010, 09:59
Стоит так "оптимизировать"  ;D, только для того чтобы потом можно было легко сменить название "myFun()".


Название: Re: Методы оптимизации исходного кода
Отправлено: kuzulis от Март 05, 2010, 10:50
Цитировать
Оптимизировать отладочный вывод? хм...
ДА! :)
Цитировать
... (если qDebud это что-то типа qDebug).
ДА! :)
Цитировать
Стоит так "оптимизировать"  Смеющийся, только для того чтобы потом можно было легко сменить название "myFun()".
Да просто лень копипаст делать, да и исходный код текст загромождает.

Вот думаю, может и вправду сделать как №2 ? Тем более, ИМХО, думаю, что при следующем вызове myFun() константа dbgStr уже будет создана и инициализирована, т.е. не нужно терять время на её создание. Хотя.. хз.


Название: Re: Методы оптимизации исходного кода
Отправлено: break от Март 05, 2010, 11:50
Оптимизировать стоит то что действительно тормозит (является узким местом и зщанимает больше чем все остальное процессорного времени), а у вас тут скорее рефакторинг.

Кстати по поводу этого рефакторинга вывода отладочных сообщений - мы у себя применили тоакой подход

Код
C++ (Qt)
#ifndef __DEBUGLOG_H__
#define __DEBUGLOG_H__
 
#include <QDebug>
 
#define INFO_OUT (qDebug() << "<" << __FILE__ << __FUNCTION__ << ">")
 
#define WARNING_OUT (qWarning() << "<" << __FILE__ << __FUNCTION__ << ">")
 
#define ERROR_OUT (qCritical() << "<" << __FILE__ << __FUNCTION__ << ">")
 
void rtLogMessageOutput( QtMsgType type, const char * msg );
 
#endif // __DEBUGLOG_H__




Код
C++ (Qt)
#include "DebugLog.h"
 
void rtLogMessageOutput( QtMsgType type, const char * msg )
{
// Для раскраски вывода в консоль использованы ESC последовательности, как это будет работать в Windows не изветсно
// если ESC последовательности не будут корректно обрабатываться прийдется их сделать через #ifdef Q_OS_LINUX
// PS1 - переменная окружения определяющая строку запроса, вся информация по используемым ESC последовательностям
// может быть найдена в хелпе по ней
// PS1='\e[0m'    ------ сброс
// PS1='\e[31m'   ------ установка красного цвета текста
switch (type)
{
case QtDebugMsg:
fprintf(stdout, "(II): %s\n", msg);
break;
case QtWarningMsg:
fprintf(stdout, "\e[32m(WW): %s\e[0m\n", msg);
break;
case QtCriticalMsg:
fprintf(stdout, "\e[31m(EE): %s\e[0m\n", msg);
break;
case QtFatalMsg:
fprintf(stdout, "\e[41m(FATAL): %s\e[0m\n", msg );
abort();
}
}
 
/*
Set Display Attributes
Set Attribute Mode <ESC>[{attr1};...;{attrn}m
Sets multiple display attribute settings. The following lists standard attributes:
0 Reset all attributes
1 Bright
2 Dim
4 Underscore
5 Blink
7 Reverse
8 Hidden
 
Foreground Colours
30 Black
31 Red
32 Green
33 Yellow
34 Blue
35 Magenta
36 Cyan
37 White
 
Background Colours
40 Black
41 Red
42 Green
43 Yellow
44 Blue
45 Magenta
46 Cyan
47 White
*/

 


На раскраску консоли не обращайте внимания - я имею ввиду макросы

INFO_OUT
WARNING_OUT
ERROR_OUT

которые позволяют вывести ошибку или ворнинг - и сразу выводится в каком файле и методе! чтобы использовать достаточно
вызвать где-то в main.cpp

   qInstallMsgHandler( rtLogMessageOutput );

а потом писать в коде

INFO_OUT << "test message";
WARNINH_OUT << "test message";
ERROR_OUT << "test message";

P.S. под виндой раскраска не работает (пока не делалолсь)


Название: Re: Методы оптимизации исходного кода
Отправлено: kuzulis от Март 05, 2010, 12:35
2 break,

спс.