#include #include #include #include #include #include #pragma GCC visibility push(default) // required when compiling with g++ -fvisibility=hidden #include #include #pragma GCC visibility pop #include using namespace std; void bzip2Compress(const string& source, string& compressed) { boost::iostreams::filtering_ostream compressingStream; compressingStream.push(boost::iostreams::bzip2_compressor()); compressingStream.push(boost::iostreams::back_inserter(compressed)); compressingStream << source; } void bzip2DeCompress(const string& compressed, string& sink) { boost::iostreams::filtering_ostream decompressingStream; decompressingStream.push(boost::iostreams::bzip2_decompressor()); decompressingStream.push(boost::iostreams::back_inserter(sink)); decompressingStream << compressed; } void gzipCompress(const string& source, string& compressed) { boost::iostreams::filtering_ostream compressingStream; compressingStream.push(boost::iostreams::gzip_compressor()); compressingStream.push(boost::iostreams::back_inserter(compressed)); compressingStream << source; } void gzipDeCompress(const string& compressed, string& sink) { #if WONT_WORK boost::iostreams::filtering_ostream decompressingStream; decompressingStream.push(boost::iostreams::gzip_decompressor()); decompressingStream.push(boost::iostreams::back_inserter(sink)); decompressingStream << compressed; #else boost::iostreams::filtering_istream decompressingStream; decompressingStream.push(boost::iostreams::gzip_decompressor()); decompressingStream.push(boost::make_iterator_range(compressed)); boost::iostreams::copy(decompressingStream, boost::iostreams::back_inserter(sink)); #endif } void zlibCompress(const string& source, string& compressed) { boost::iostreams::filtering_ostream compressingStream; compressingStream.push(boost::iostreams::zlib_compressor()); compressingStream.push(boost::iostreams::back_inserter(compressed)); compressingStream << source; } void zlibDeCompress(const string& compressed, string& sink) { boost::iostreams::filtering_ostream decompressingStream; decompressingStream.push(boost::iostreams::zlib_decompressor()); decompressingStream.push(boost::iostreams::back_inserter(sink)); decompressingStream << compressed; } static const unsigned int LIMIT = 100000; int main() { //ifstream ifs("src/IoStreams.cpp"); //ifstream ifs("input.xml"); //string source; //boost::iostreams::copy(ifs, boost::iostreams::back_inserter(source)); string source("1, 2, Test, Test"); string compressed; string sink; unsigned int sizeOfSource = source.size(); cout << "Size of original: " << sizeOfSource << endl; cout << "Number of compressions/decompressions: " << LIMIT << endl << endl; boost::posix_time::ptime now = boost::posix_time::microsec_clock::universal_time(); for (unsigned int i = 0; i < LIMIT; ++i) { compressed.clear(); bzip2Compress(source, compressed); } cout << "bzip2:" << endl; cout << "======" << endl; cout << "Size of compressed: " << compressed.size() << endl; cout << "Compression time: " << (boost::posix_time::microsec_clock::universal_time() - now) << endl; now = boost::posix_time::microsec_clock::universal_time(); for (unsigned int i = 0; i < LIMIT; ++i) { sink.clear(); bzip2DeCompress(compressed, sink); if (sink != source) { cerr << "bzip2 failed" << endl; return 1; } } cout << "De-Compression time: " << (boost::posix_time::microsec_clock::universal_time() - now) << endl; cout << endl; now = boost::posix_time::microsec_clock::universal_time(); for (unsigned int i = 0; i < LIMIT; ++i) { compressed.clear(); gzipCompress(source, compressed); } cout << "gzip:" << endl; cout << "=====" << endl; cout << "Size of compressed: " << compressed.size() << endl; cout << "Compression time: " << (boost::posix_time::microsec_clock::universal_time() - now) << endl; now = boost::posix_time::microsec_clock::universal_time(); for (unsigned int i = 0; i < LIMIT; ++i) { sink.clear(); gzipDeCompress(compressed, sink); if (sink != source) { cerr << "gzip failed" << endl; return 1; } } cout << "De-Compression time: " << (boost::posix_time::microsec_clock::universal_time() - now) << endl; cout << endl; now = boost::posix_time::microsec_clock::universal_time(); for (unsigned int i = 0; i < LIMIT; ++i) { compressed.clear(); zlibCompress(source, compressed); } cout << "zlib:" << endl; cout << "=====" << endl; cout << "Size of compressed: " << compressed.size() << endl; cout << "Compression time: " << (boost::posix_time::microsec_clock::universal_time() - now) << endl; now = boost::posix_time::microsec_clock::universal_time(); for (unsigned int i = 0; i < LIMIT; ++i) { sink.clear(); zlibDeCompress(compressed, sink); if (sink != source) { cerr << "zlib failed" << endl; return 1; } } cout << "De-Compression time: " << (boost::posix_time::microsec_clock::universal_time() - now) << endl; cout << endl; return 0; }