Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > templatized logging

Reply
Thread Tools

templatized logging

 
 
Luther Baker
Guest
Posts: n/a
 
      05-21-2004
I'd like to include some very simple logging in my app - removable at
compile time.

Avoiding macros .. I want to make sure this nonsense would be
optimized away by the compiler if I don't need it.


template<bool b>
void
log(const char* msg)
{
if (b == true)
{
std::cout << msg << std::endl;
}
}

....

const bool is_log_on = false;

int
main(int argc, char* argv)
{
...
log<is_log_on>("I am here.");
...
}



Since "is_log_on" evaluates to false at compile time, I'm hoping the
compiler optimizes it away so there is absolutely no affect on
performance. Is there a well-known problem with this approach or
extending it into a full blown out logging template class?

<offtopic>
Google and my ISPs newsgroup servers are so slow. Can anyone recommend
a free or relatively inexpensive good newgroup server to use?
</offtopic>

Thanks,

-Luther
 
Reply With Quote
 
 
 
 
Victor Bazarov
Guest
Posts: n/a
 
      05-21-2004
Luther Baker wrote:
> I'd like to include some very simple logging in my app - removable at
> compile time.


Why not run-time?

> Avoiding macros .. I want to make sure this nonsense would be
> optimized away by the compiler if I don't need it.


Once you get used to logging, you will always need it.

> template<bool b>
> void
> log(const char* msg)
> {
> if (b == true)
> {
> std::cout << msg << std::endl;
> }
> }
>
> ...
>
> const bool is_log_on = false;
>
> int
> main(int argc, char* argv)
> {
> ...
> log<is_log_on>("I am here.");


That doesn't _remove_ it. It just prevents it from outputting.

> ...
> }
>
>
>
> Since "is_log_on" evaluates to false at compile time, I'm hoping the
> compiler optimizes it away so there is absolutely no affect on
> performance.


If performance is your concern, you should simply turn the logging off by
default when running. And turn it on if needed.

> Is there a well-known problem with this approach or
> extending it into a full blown out logging template class?


A problem I know of is often poor knowledge of available solutions that
leads to spending too much time on re-inventing wheels making them square
or triangular. Look at

http://logging.apache.org/log4cxx/

Victor
 
Reply With Quote
 
 
 
 
John Harrison
Guest
Posts: n/a
 
      05-22-2004

"Luther Baker" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed) om...
> I'd like to include some very simple logging in my app - removable at
> compile time.
>
> Avoiding macros .. I want to make sure this nonsense would be
> optimized away by the compiler if I don't need it.
>
>
> template<bool b>
> void
> log(const char* msg)
> {
> if (b == true)
> {
> std::cout << msg << std::endl;
> }
> }
>
> ...
>
> const bool is_log_on = false;
>
> int
> main(int argc, char* argv)
> {
> ...
> log<is_log_on>("I am here.");
> ...
> }
>
>
>
> Since "is_log_on" evaluates to false at compile time, I'm hoping the
> compiler optimizes it away so there is absolutely no affect on
> performance. Is there a well-known problem with this approach or
> extending it into a full blown out logging template class?


If you use a template class then you can specialise it rather than using a
runtime if statement.

template <bool on>
class Logger
{
public:
static void log()
{
cout << "here\n";
}
};

template <>
class Logger<false>
{
public:
void log()
{
}
};

const bool logging = true;

int main()
{
X<logging>::f();
}

More chance of the compiler performing the necessary optimisation if you
give it a little help.

john


 
Reply With Quote
 
Siemel Naran
Guest
Posts: n/a
 
      05-22-2004
http://www.velocityreviews.com/forums/(E-Mail Removed) (Luther Baker) wrote in message

> I'd like to include some very simple logging in my app - removable at
> compile time.
>
> Avoiding macros .. I want to make sure this nonsense would be
> optimized away by the compiler if I don't need it.
>
>
> template<bool b>
> void
> log(const char* msg)
> {
> if (b == true)
> {
> std::cout << msg << std::endl;
> }
> }
>
> ...
>
> const bool is_log_on = false;
>
> int
> main(int argc, char* argv)
> {
> ...
> log<is_log_on>("I am here.");
> ...
> }
>
>
>
> Since "is_log_on" evaluates to false at compile time, I'm hoping the
> compiler optimizes it away so there is absolutely no affect on
> performance. Is there a well-known problem with this approach or
> extending it into a full blown out logging template class?


The optimization may happen on your compiler -- check the assembly to
be sure. To improve the chances of optimization, make the function
inline. If this doesn't work, provide a specialization of log<false>
which does nothing and dispense with the if statement inside
log<true>. Let us know your findings, what compiler you used,
compiler flags, etc.

Note one normally says,

log << "hello" << x+1;

So even if logging is off, the compiler may still evaluate "hello" and
x+1. If it knows that evaluating x+1 has no side effects and
operator<< does nothing if bool is_log_on = false, then it need not
evaluate x+1. But I don't think most compilers do this level of
optimization.

As a design issue, I'd declare const bool _log_on = true or false at
the top, and so in code I just write log("I am here."); instead of
log<is_log_on>("I am here.");. But that's your call.
 
Reply With Quote
 
Luther Baker
Guest
Posts: n/a
 
      05-22-2004
John Harrison wrote:

> "Luther Baker" <(E-Mail Removed)> wrote in message
> news:(E-Mail Removed) om...

....
>
>
> If you use a template class then you can specialise it rather than using a
> runtime if statement.
>
> template <bool on>
> class Logger
> {
> public:
> static void log()
> {
> cout << "here\n";
> }
> };
>
> template <>
> class Logger<false>
> {
> public:
> void log()
> {
> }
> };
>
> const bool logging = true;
>
> int main()
> {
> X<logging>::f();
> }
>
> More chance of the compiler performing the necessary optimisation if you
> give it a little help.


Oh yes. I overlooked that completely - so much cleaner than a macro.

Thanks again,

-Luther
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Invoking templatized base class constructor from templatized derived class constructor mrstephengross C++ 5 05-18-2005 07:12 PM
Templatized 'Random' member function. ma740988 C++ 3 11-06-2004 07:16 PM
Templatized operator () overload Paul Escherton C++ 2 11-10-2003 11:18 AM
How do I load data to a templatized class hall C++ 2 10-29-2003 10:30 AM
templatized state model skscpp C++ 1 09-08-2003 08:31 PM



Advertisments