On Mar 19, 2008, at 11:40 AM, Jacob L. Anawalt wrote:

Curt Arnold wrote:
On Mar 18, 2008, at 12:01 PM, Jacob L. Anawalt wrote:

again. If it hadn't been, I was thinking that the current online API docs looked a little more efficient for simple strings (which is where I currently use the logging macros), and that I would re- implement the older style macros as LS_LOG4CXX_*(logger,streamInput).
I don't follow the last sentence. The current macro definitions (and the implementation of the supporting classes) attempts to avoid the use of an actual std::basic_ostream if possible, so it should be more efficient for logging simple strings than the 0.9.7 implementation or an alternative using logstream.

I hadn't looked at how the latest (svn HEAD) auto-detecting method worked, so I was going off of your statement that "...experimentation hopefully results...", and stating that in case it didn't, I could simply fall back to writing my own macros like the 0.9.7 ones.

Since 'current' seemed to get a little blurred, this is what I was referring to:

1) 0.9.7 version:
#define LOG4CXX_DEBUG ( logger, message ) { \
       if (logger->isDebugEnabled()) {\
       ::log4cxx::StringBuffer oss; \
       oss << message; \
logger->forcedLog(::log4cxx::Level::DEBUG, oss.str(), __FILE__, __LINE__); }}

2) current online API docs:
#define LOG4CXX_DEBUG (logger,message) { \
       if (LOG4CXX_UNLIKELY(logger->isDebugEnabled())) {\
logger->forcedLog(::log4cxx::Level::getDebug(), message, LOG4CXX_LOCATION); }}

The on-line docs have not been updated and that code does not reflect the current SVN HEAD. A staged copy of the new online docs 0.10.0 RC2 can be viewed at http://svn.apache.org/repos/asf/logging/site/trunk/docs/log4cxx/index.html . That will be updated for RC3 and the a release candidate is accepted, that content will be pushed to the public web site.




It seemed to me that 2 is more efficient than 1 when the argument to the macro is either a static string, eg "Hello World", or a std::string containing some string my program needed to generate anyway because 2 does not create a temporary StringBuffer and avoids the << and str() function calls.

3) this morning's svn HEAD (which I wasn't referring to before):
#define LOG4CXX_DEBUG ( logger, message ) { \
       if (LOG4CXX_UNLIKELY(logger->isDebugEnabled())) {\
          ::log4cxx::helpers::MessageBuffer oss_; \
logger->forcedLog(::log4cxx::Level::getDebug(), oss_.str(oss_ << message), LOG4CXX_LOCATION); }}

Taking an initial look at 3 this morning, it appears to create a temporary object, and call << and str() as well. Based on what you have said about 3 avoiding creating an ostream, it must be more efficient than 1 and possibly only slightly less efficient than 2. Someone needing that extra boost and only using strings may prefer to duplicate 2 with their own localized name.

As far as I remember, there was no discernible performance difference due to the construction of MessageBuffer.



Adding W would not transparently support logging TCHAR*

True, and MessageBuffer appears to be a clever solution to this.

I haven't had luck with everything 'just working' when defining UNICODE or not so instead I specify what my stream and character types are and define conversion boundaries within the software. The days are fading away where I even care to write something new for MS Windows desktops that isn't UNICODE inside. I am glad you have a solution that works for all of us.

Thank you,
--
Jacob Anawalt
Gecko Software, Inc.
[EMAIL PROTECTED]
435-752-8026

Reply via email to