00001 #include <cstdlib>
00002 #include <cstring>
00003 #include <cstdio>
00004 #include <iostream>
00005
00006 #include <log4cpp/Category.hh>
00007 #include <log4cpp/OstreamAppender.hh>
00008 #include <log4cpp/FileAppender.hh>
00009 #include <log4cpp/BasicLayout.hh>
00010 #include <log4cpp/PatternLayout.hh>
00011 #include <log4cpp/TimeStamp.hh>
00012
00013 #include "Clock.hh"
00014
00015
00016
00017 int main(int argc, char* argv[])
00018 {
00019 int count = argc > 1 ? std::atoi(argv[1]) : 100;
00020 size_t size = argc > 2 ? std::atoi(argv[2]) : 128;
00021
00022 std::cout << " count: " << count << std::endl
00023 << " size: " << size << " bytes" << std::endl
00024 << std::endl;
00025
00026 log4cpp::Category& root = log4cpp::Category::getRoot();
00027 root.setPriority(log4cpp::Priority::ERROR);
00028
00029 log4cpp::OstreamAppender ostreamAppender("cerr", &std::cerr);
00030 log4cpp::FileAppender fileAppender("stderr", fileno(stderr));
00031 ostreamAppender.setLayout(new log4cpp::BasicLayout());
00032 fileAppender.setLayout(new log4cpp::BasicLayout());
00033
00034 root.removeAllAppenders();
00035 root.addAppender(ostreamAppender);
00036
00037 log4cpp::Category& log = log4cpp::Category::getInstance("someCategory");
00038
00039 Clock clock;
00040 char* buffer = new char[size + 1];
00041
00042 std::memset(buffer, 'X', size + 1);
00043 buffer[size] = '\0';
00044
00045 std::cout << "BasicLayout:" << std::endl;
00046 {
00047 clock.start();
00048 for (int i = 0; i < count; i++) log.error("%s", buffer);
00049 clock.stop();
00050 std::cout << " charbuf printf ostream: " << ((float)clock.elapsed()) / count << " us" << std::endl;
00051 }
00052
00053 {
00054 const char* buffer2 = buffer;
00055 clock.start();
00056 for (int i = 0; i < count; i++) log.error(std::string(buffer2));
00057 clock.stop();
00058 std::cout << " charbuf string ostream: " << ((float)clock.elapsed()) / count << " us" << std::endl;
00059 }
00060
00061 {
00062 std::string str(size, 'X');
00063
00064 clock.start();
00065 for (int i = 0; i < count; i++)
00066 log << log4cpp::Priority::ERROR << str;
00067 clock.stop();
00068 std::cout << " string stream ostream: " << ((float)clock.elapsed()) / count << " us" << std::endl;
00069 }
00070
00071 {
00072 clock.start();
00073 for (int i = 0; i < count; i++)
00074 log << log4cpp::Priority::ERROR << buffer;
00075 clock.stop();
00076 std::cout << " charbuf stream ostream: " << ((float)clock.elapsed()) / count << " us" << std::endl;
00077 }
00078
00079 {
00080 std::string str(size, 'X');
00081
00082 clock.start();
00083 log4cpp::CategoryStream s(log << log4cpp::Priority::ERROR);
00084 for (int i = 0; i < count; i++)
00085 s << str << log4cpp::eol;
00086 clock.stop();
00087 std::cout << " string stream2 ostream: " << ((float)clock.elapsed()) / count << " us" << std::endl;
00088 }
00089
00090 {
00091 clock.start();
00092 log4cpp::CategoryStream s(log << log4cpp::Priority::ERROR);
00093 for (int i = 0; i < count; i++)
00094 s << buffer << log4cpp::eol;
00095 clock.stop();
00096 std::cout << " charbuf stream2 ostream: " << ((float)clock.elapsed()) / count << " us" << std::endl;
00097 }
00098
00099 {
00100 std::string str(size, 'X');
00101
00102 clock.start();
00103 for (int i = 0; i < count; i++) log.error(str);
00104 clock.stop();
00105 std::cout << " direct string ostream: " << ((float)clock.elapsed()) / count << " us" << std::endl;
00106 }
00107
00108 {
00109 std::string str(size, 'X');
00110 root.removeAllAppenders();
00111 root.addAppender(fileAppender);
00112
00113 clock.start();
00114 for (int i = 0; i < count; i++) log.error(str);
00115 clock.stop();
00116 std::cout << " direct string file: " << ((float)clock.elapsed()) / count << " us" << std::endl;
00117 }
00118
00119 std::cout << "PatternLayout:" << std::endl;
00120 {
00121 log4cpp::PatternLayout* patternLayout = new log4cpp::PatternLayout();
00122 patternLayout->setConversionPattern("%R %p %c %x: %m\n");
00123 ostreamAppender.setLayout(patternLayout);
00124 }
00125 {
00126 log4cpp::PatternLayout* patternLayout = new log4cpp::PatternLayout();
00127 patternLayout->setConversionPattern("%R %p %c %x: %m\n");
00128 fileAppender.setLayout(patternLayout);
00129 }
00130
00131 root.removeAllAppenders();
00132 root.addAppender(ostreamAppender);
00133
00134 {
00135 clock.start();
00136 for (int i = 0; i < count; i++) log.error("%s", buffer);
00137 clock.stop();
00138 std::cout << " charbuf printf ostream: " << ((float)clock.elapsed()) / count << " us" << std::endl;
00139 }
00140
00141 {
00142 std::string str(size, 'X');
00143
00144 clock.start();
00145 for (int i = 0; i < count; i++) log.error(str);
00146 clock.stop();
00147 std::cout << " direct string ostream: " << ((float)clock.elapsed()) / count << " us" << std::endl;
00148 }
00149
00150 {
00151 std::string str(size, 'X');
00152 root.removeAllAppenders();
00153 root.addAppender(fileAppender);
00154
00155 clock.start();
00156 for (int i = 0; i < count; i++) log.error(str);
00157 clock.stop();
00158 std::cout << " string file: " << ((float)clock.elapsed()) / count << " us" << std::endl;
00159 }
00160
00161 {
00162 clock.start();
00163 for (int i = 0; i < count; i++) fprintf(stderr, "%d ERROR someCategory : %s\n", log4cpp::TimeStamp().getSeconds(), buffer);
00164 clock.stop();
00165 std::cout << std::endl << " fprintf: " << ((float)clock.elapsed()) / count << " us" << std::endl;
00166 }
00167
00168 delete[] buffer;
00169 log4cpp::Category::shutdown();
00170
00171 return 0;
00172 }