This Project Has Not Released Any Files
ログ出力にかかった時間を計測しています。
testbench.cpp
- #include <cstdlib>
- #include <cstring>
- #include <cstdio>
- #include <iostream>
- #include <log4cpp/Category.hh>
- #include <log4cpp/OstreamAppender.hh>
- #include <log4cpp/FileAppender.hh>
- #include <log4cpp/BasicLayout.hh>
- #include <log4cpp/PatternLayout.hh>
- #include <log4cpp/TimeStamp.hh>
- #include "Clock.hh"
- // -----------------------------------------------------------------------------
- int main(int argc, char* argv[])
- {
- int count = argc > 1 ? std::atoi(argv[1]) : 100;
- size_t size = argc > 2 ? std::atoi(argv[2]) : 128;
- std::cout << " count: " << count << std::endl
- << " size: " << size << " bytes" << std::endl
- << std::endl;
- log4cpp::Category& root = log4cpp::Category::getRoot();
- root.setPriority(log4cpp::Priority::ERROR);
- log4cpp::OstreamAppender ostreamAppender("cerr", &std::cerr);
- log4cpp::FileAppender fileAppender("stderr", fileno(stderr));
- ostreamAppender.setLayout(new log4cpp::BasicLayout());
- fileAppender.setLayout(new log4cpp::BasicLayout());
- root.removeAllAppenders();
- root.addAppender(ostreamAppender);
- log4cpp::Category& log = log4cpp::Category::getInstance("someCategory");
- Clock clock;
- char* buffer = new char[size + 1];
- std::memset(buffer, 'X', size + 1);
- buffer[size] = '\0';
- std::cout << "BasicLayout:" << std::endl;
- {
- clock.start();
- for (int i = 0; i < count; i++) log.error("%s", buffer);
- clock.stop();
- std::cout << " charbuf printf ostream: " << ((float)clock.elapsed()) / count << " us" << std::endl;
- }
- {
- const char* buffer2 = buffer;
- clock.start();
- for (int i = 0; i < count; i++) log.error(std::string(buffer2));
- clock.stop();
- std::cout << " charbuf string ostream: " << ((float)clock.elapsed()) / count << " us" << std::endl;
- }
- {
- std::string str(size, 'X');
- clock.start();
- for (int i = 0; i < count; i++)
- log << log4cpp::Priority::ERROR << str;
- clock.stop();
- std::cout << " string stream ostream: " << ((float)clock.elapsed()) / count << " us" << std::endl;
- }
- {
- clock.start();
- for (int i = 0; i < count; i++)
- log << log4cpp::Priority::ERROR << buffer;
- clock.stop();
- std::cout << " charbuf stream ostream: " << ((float)clock.elapsed()) / count << " us" << std::endl;
- }
- {
- std::string str(size, 'X');
- clock.start();
- log4cpp::CategoryStream s(log << log4cpp::Priority::ERROR);
- for (int i = 0; i < count; i++)
- s << str << log4cpp::eol;
- clock.stop();
- std::cout << " string stream2 ostream: " << ((float)clock.elapsed()) / count << " us" << std::endl;
- }
- {
- clock.start();
- log4cpp::CategoryStream s(log << log4cpp::Priority::ERROR);
- for (int i = 0; i < count; i++)
- s << buffer << log4cpp::eol;
- clock.stop();
- std::cout << " charbuf stream2 ostream: " << ((float)clock.elapsed()) / count << " us" << std::endl;
- }
- {
- std::string str(size, 'X');
- clock.start();
- for (int i = 0; i < count; i++) log.error(str);
- clock.stop();
- std::cout << " direct string ostream: " << ((float)clock.elapsed()) / count << " us" << std::endl;
- }
- {
- std::string str(size, 'X');
- root.removeAllAppenders();
- root.addAppender(fileAppender);
- clock.start();
- for (int i = 0; i < count; i++) log.error(str);
- clock.stop();
- std::cout << " direct string file: " << ((float)clock.elapsed()) / count << " us" << std::endl;
- }
- std::cout << "PatternLayout:" << std::endl;
- {
- log4cpp::PatternLayout* patternLayout = new log4cpp::PatternLayout();
- patternLayout->setConversionPattern("%R %p %c %x: %m\n");
- ostreamAppender.setLayout(patternLayout);
- }
- {
- log4cpp::PatternLayout* patternLayout = new log4cpp::PatternLayout();
- patternLayout->setConversionPattern("%R %p %c %x: %m\n");
- fileAppender.setLayout(patternLayout);
- }
- root.removeAllAppenders();
- root.addAppender(ostreamAppender);
- {
- clock.start();
- for (int i = 0; i < count; i++) log.error("%s", buffer);
- clock.stop();
- std::cout << " charbuf printf ostream: " << ((float)clock.elapsed()) / count << " us" << std::endl;
- }
- {
- std::string str(size, 'X');
- clock.start();
- for (int i = 0; i < count; i++) log.error(str);
- clock.stop();
- std::cout << " direct string ostream: " << ((float)clock.elapsed()) / count << " us" << std::endl;
- }
- {
- std::string str(size, 'X');
- root.removeAllAppenders();
- root.addAppender(fileAppender);
- clock.start();
- for (int i = 0; i < count; i++) log.error(str);
- clock.stop();
- std::cout << " string file: " << ((float)clock.elapsed()) / count << " us" << std::endl;
- }
- {
- clock.start();
- for (int i = 0; i < count; i++) fprintf(stderr, "%d ERROR someCategory : %s\n", log4cpp::TimeStamp().getSeconds(), buffer);
- clock.stop();
- std::cout << std::endl << " fprintf: " << ((float)clock.elapsed()) / count << " us" << std::endl;
- }
- delete[] buffer;
- log4cpp::Category::shutdown();
- return 0;
- }
Clock.hh
- /* $Id: Clock.hh,v 1.5 2002/09/15 22:40:50 bastiaan Exp $
- *
- * See the COPYING file for the terms of usage and distribution.
- */
- #ifndef __CLOCK_H
- #define __CLOCK_H
- #ifdef LOG4CPP_HAVE_STDINT_H
- #include <stdint.h>
- #endif // LOG4CPP_HAVE_STDINT_H
- #ifdef __osf__
- typedef long usec_t; /* number of microseconds since 1970/01/01 */
- # define INT64_CONSTANT(val) (val##L)
- #else
- typedef int64_t usec_t;
- # define INT64_CONSTANT(val) (val##LL)
- #endif
- class Clock
- {
- public:
- static bool UsingCPU;
- static usec_t time(void);
- Clock(void);
- ~Clock(void);
- bool active(void) const { return _active; }
- usec_t elapsed(void) const;
- usec_t start(void);
- usec_t reset(void) { return start(); }
- usec_t stop(void);
- private:
- usec_t _start;
- usec_t _elapsed;
- bool _active;
- };
- #endif
Clock.cpp
- static const char rcsid[] = "$Id: Clock.cpp,v 1.9 2002/09/15 22:40:50 bastiaan Exp $";
- /*
- * See the COPYING file for the terms of usage and distribution.
- */
- #include <cstdlib>
- #include <sys/time.h> // for struct timeval
- #ifdef __osf__
- # include <machine/builtins.h> // for __RPCC()
- #elif __linux__ && __i386__
- # define rdtscl(low) \
- __asm__ __volatile__("rdtsc" : "=a" (low) : : "edx")
- #endif
- #include <iostream>
- #include "Clock.hh"
- namespace
- {
- const usec_t UsecPerSec = INT64_CONSTANT(1000000);
- }
- bool Clock::UsingCPU = std::getenv("CLOCK_USE_CPU") ? true : false;
- // -----------------------------------------------------------------------------
- usec_t Clock::time(void)
- {
- if (UsingCPU) {
- static bool warn = true;
- if (warn) {
- std::cout << "Using CPU clock." << std::endl;
- warn = false;
- }
- #ifdef __osf__
- return (usec_t) __RPCC();
- #elif __linux__ && __i386__
- {
- unsigned long tsc;
- rdtscl(tsc);
- return (usec_t) tsc;
- }
- #else
- {
- std::cerr << "CPU clock not implemented for this architecture" << std::endl;
- UsingCPU = false;
- return Clock::time();
- }
- #endif
- } else {
- struct timeval tv;
- gettimeofday(&tv, NULL);
- return (usec_t) (tv.tv_sec * UsecPerSec + tv.tv_usec);
- }
- }
- // -----------------------------------------------------------------------------
- Clock::Clock(void)
- : _start(0),
- _elapsed(0),
- _active(false)
- {
- start();
- }
- // -----------------------------------------------------------------------------
- Clock::~Clock(void)
- {
- ;
- }
- // -----------------------------------------------------------------------------
- usec_t Clock::elapsed(void) const
- {
- if (!active())
- return _elapsed;
- return time() - _start;
- }
- // -----------------------------------------------------------------------------
- usec_t Clock::start(void)
- {
- _active = true;
- return _start = time();
- }
- // -----------------------------------------------------------------------------
- usec_t Clock::stop(void)
- {
- _elapsed = elapsed();
- _active = false;
- return _elapsed;
- }
testbench.cppをビルドし、実行した結果です。結果は環境により変わりますので、参考程度としてください。なお、実行環境はLinux(Ubuntu 11.0)です。
stdout(標準出力):
count: 100 size: 128 bytes BasicLayout: charbuf printf ostream: 168.27 us charbuf string ostream: 180.15 us string stream ostream: 466.3 us charbuf stream ostream: 316.01 us string stream2 ostream: 1275.56 us charbuf stream2 ostream: 741.45 us direct string ostream: 680.31 us direct string file: 1354.59 us PatternLayout: charbuf printf ostream: 737.43 us direct string ostream: 643.69 us string file: 1399.6 us fprintf: 714.83 usstderr(標準エラー出力):
1336790214 ERROR someCategory : XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXが1200回出力されます。
[PageInfo]
LastUpdate: 2012-05-12 19:40:10, ModifiedBy: daruma_kyo
[License]
GNU Free Documentation License
[Permissions]
view:all, edit:login users, delete/config:members