co::ConnectionPtr _startLocalServer() { Strings dirNames; dirNames.push_back( "" ); dirNames.push_back( "./" ); // Add path of current .so so search paths for EqualizerServer #ifndef _WIN32 Dl_info dl_info; dladdr((void *)_startLocalServer, &dl_info); char libPath[1024]; strncpy(libPath, dl_info.dli_fname, 1024); char* k = strrchr(libPath, '/'); *(k + 1) = '\0'; dirNames.push_back( libPath ); #endif #ifdef EQ_BUILD_DIR #ifdef NDEBUG dirNames.push_back( std::string( EQ_BUILD_DIR ) + "libs/server/Release/" ); #else dirNames.push_back( std::string( EQ_BUILD_DIR ) + "libs/server/Debug/" ); #endif dirNames.push_back( std::string( EQ_BUILD_DIR ) + "libs/server/" ); #endif #ifdef _MSC_VER const std::string libName = "EqualizerServer.dll"; #elif defined (_WIN32) const std::string libName = "libEqualizerServer.dll"; #elif defined (Darwin) const std::string libName = "libEqualizerServer.dylib"; #else const std::string libName = "libEqualizerServer.so"; #endif while( !_libeqserver.isOpen() && !dirNames.empty( )) { _libeqserver.open( dirNames.back() + libName ); dirNames.pop_back(); } if( !_libeqserver.isOpen( )) { EQWARN << "Can't open Equalizer server library" << std::endl; return 0; } eqsStartLocalServer_t eqsStartLocalServer = (eqsStartLocalServer_t) _libeqserver.getFunctionPointer( "eqsStartLocalServer" ); if( !eqsStartLocalServer ) { EQWARN << "Can't find server entry function eqsStartLocalServer" << std::endl; return 0; } return eqsStartLocalServer( Global::getConfigFile( )); }
co::ConnectionPtr _startLocalServer() { Strings dirNames; dirNames.push_back( "" ); #ifdef EQ_BUILD_DIR #ifdef NDEBUG dirNames.push_back( std::string( EQ_BUILD_DIR ) + "lib/Release/" ); #else dirNames.push_back( std::string( EQ_BUILD_DIR ) + "lib/Debug/" ); #endif dirNames.push_back( std::string( EQ_BUILD_DIR ) + "lib/" ); #endif #ifdef _MSC_VER const std::string libName = "EqualizerServer.dll"; #elif defined (_WIN32) const std::string libName = "libEqualizerServer.dll"; #elif defined (Darwin) const std::string libName = "libEqualizerServer.dylib"; #else const std::string libName = "libEqualizerServer.so"; #endif while( !_libeqserver.isOpen() && !dirNames.empty( )) { _libeqserver.open( dirNames.back() + libName ); dirNames.pop_back(); } if( !_libeqserver.isOpen( )) { LBWARN << "Can't open Equalizer server library" << std::endl; return 0; } eqsStartLocalServer_t eqsStartLocalServer = (eqsStartLocalServer_t) _libeqserver.getFunctionPointer( "eqsStartLocalServer" ); if( !eqsStartLocalServer ) { LBWARN << "Can't find server entry function eqsStartLocalServer" << std::endl; return 0; } return eqsStartLocalServer( Global::getConfigFile( )); }
int main(int argc, char ** argv) { using Strings = std::vector<std::string>; using Hashes = std::vector<char>; Strings strings; size_t rows = 0; size_t bytes = 0; { Stopwatch watch; DB::ReadBufferFromFileDescriptor in(STDIN_FILENO); while (!in.eof()) { strings.push_back(std::string()); DB::readEscapedString(strings.back(), in); DB::assertChar('\n', in); bytes += strings.back().size() + 1; } watch.stop(); rows = strings.size(); std::cerr << std::fixed << std::setprecision(2) << "Read " << rows << " rows, " << bytes / 1000000.0 << " MB" << ", elapsed: " << watch.elapsedSeconds() << " (" << rows / watch.elapsedSeconds() << " rows/sec., " << bytes / 1000000.0 / watch.elapsedSeconds() << " MB/sec.)" << std::endl; } Hashes hashes(16 * rows); { Stopwatch watch; for (size_t i = 0; i < rows; ++i) { *reinterpret_cast<UInt64*>(&hashes[i * 16]) = CityHash64(strings[i].data(), strings[i].size()); } watch.stop(); UInt64 check = CityHash64(&hashes[0], hashes.size()); std::cerr << std::fixed << std::setprecision(2) << "CityHash64 (check = " << check << ")" << ", elapsed: " << watch.elapsedSeconds() << " (" << rows / watch.elapsedSeconds() << " rows/sec., " << bytes / 1000000.0 / watch.elapsedSeconds() << " MB/sec.)" << std::endl; } /* { Stopwatch watch; std::vector<char> seed(16); for (size_t i = 0; i < rows; ++i) { sipHash( reinterpret_cast<unsigned char *>(&hashes[i * 16]), reinterpret_cast<const unsigned char *>(strings[i].data()), strings[i].size(), reinterpret_cast<const unsigned char *>(&seed[0])); } watch.stop(); UInt64 check = CityHash64(&hashes[0], hashes.size()); std::cerr << std::fixed << std::setprecision(2) << "SipHash (check = " << check << ")" << ", elapsed: " << watch.elapsedSeconds() << " (" << rows / watch.elapsedSeconds() << " rows/sec., " << bytes / 1000000.0 / watch.elapsedSeconds() << " MB/sec.)" << std::endl; }*/ { Stopwatch watch; for (size_t i = 0; i < rows; ++i) { SipHash hash; hash.update(strings[i].data(), strings[i].size()); hash.get128(&hashes[i * 16]); } watch.stop(); UInt64 check = CityHash64(&hashes[0], hashes.size()); std::cerr << std::fixed << std::setprecision(2) << "SipHash, stream (check = " << check << ")" << ", elapsed: " << watch.elapsedSeconds() << " (" << rows / watch.elapsedSeconds() << " rows/sec., " << bytes / 1000000.0 / watch.elapsedSeconds() << " MB/sec.)" << std::endl; } { Stopwatch watch; for (size_t i = 0; i < rows; ++i) { MD5_CTX state; MD5_Init(&state); MD5_Update(&state, reinterpret_cast<const unsigned char *>(strings[i].data()), strings[i].size()); MD5_Final(reinterpret_cast<unsigned char *>(&hashes[i * 16]), &state); } watch.stop(); UInt64 check = CityHash64(&hashes[0], hashes.size()); std::cerr << std::fixed << std::setprecision(2) << "MD5 (check = " << check << ")" << ", elapsed: " << watch.elapsedSeconds() << " (" << rows / watch.elapsedSeconds() << " rows/sec., " << bytes / 1000000.0 / watch.elapsedSeconds() << " MB/sec.)" << std::endl; } return 0; }