IP Moiseenko A.A. (MaaSoft/MaaSoftware OOO) |
|
|
Тест хеш-таблиц ToolsLib. Скачать Test_STL_vs_ToolsLib.rar (RAR, 1.04 KB), 124 загрузок., перенесено с форума Переработанные тест 1 (CPP, 3.42 KB), 110 загрузок и тест 2 (CPP, 5.00 KB), 132 загрузок. По данным тестов (2015 г.) ToolsLib до 15 раз быстрее STL для машины класса Core2Duo. На современном VDS (2017 г.) с Linux Debian 9.2 x64 gcc version 6.3.0 (c++11) тесты показывают только 1.5х увеличение производительности. Тест 1: /* ToolsLib CMaaUnivHash is 3.5x - 15x faster than unordered_map git clone git://git.maasoftware.ru/ToolsLib.git output (Visual C++ 2010, 32 bits, Windows XP, Core2Duo E7400, 2800 MHz): unordered_map<int, int> : 359,772 hmap.insert() 282,048 hmap.erase(iter) 357,760 hmap.insert() 307,778 hmap.erase(val) CMaaUnivHash<int, int> : 94,252 h.Add() 38,232 it.Remove() 45,917 h.Add() 20,542 h.Remove() $ g++ -o a2.out -std=c++11 -lstdc++ -lpthread main2.cpp ../ToolsLib/ToolsLib.a output (on Linux Debian 7.6 x64 VDS, Intel Xeon E5, 2000 MHz): unordered_map<int, int> : 625,677 hmap.insert() 285,488 hmap.erase(iter) 595,525 hmap.insert() 252,544 hmap.erase(val) CMaaUnivHash<int, int> : 277,266 h.Add() 244,400 it.Remove() 129,552 h.Add() 74,735 h.Remove() */ #ifdef __unix__ #include "../ToolsLib/ToolsLib.h" #else #include "..\ToolsLib\ToolsLib.h" #endif #include <iostream> //#include <algorithm> //#include <hash_map> #include <unordered_map> int main() { typedef std::pair <int, int> ipair; std::unordered_map<int, int> hmap; std::unordered_map<int, int>::iterator ihmap, ihmap2; int i; CHrtMultiTimer t0, t1; CMaaString s0, s1; t0.Start(); for (i = 0; i < 1000000; i++) { hmap.insert(ipair(i, i)); } t0.Stop("hmap.insert()"); t0.Start(); for (ihmap = hmap.begin(); ihmap != hmap.end(); ihmap = ihmap2) { ihmap2 = ihmap; ++ihmap2; hmap.erase(ihmap); } t0.Stop("hmap.erase(iter)"); t0.Start(); for (i = 0; i < 1000000; i++) { hmap.insert(ipair(i, i)); } t0.Stop("hmap.insert()"); t0.Start(); for (i = 0; i < 1000000; i++) { hmap.erase(i); } t0.Stop("hmap.erase(val)"); s0 = t0.GetResult("unordered_map<int, int> :\n"); __utf8_printf("%S\n", &s0); CMaaUnivHash<int, int> h; t1.Start(); for (i = 0; i < 1000000; i++) { h.Add(i, i); } t1.Stop("h.Add()"); t1.Start(); CMaaUnivHash<int, int>::iterator it(h); for (; it; ++it) { it.Remove(); } t1.Stop("it.Remove()"); t1.Start(); for (i = 0; i < 1000000; i++) { h.Add(i, i); } t1.Stop("h.Add()"); t1.Start(); for (i = 0; i < 1000000; i++) { h.Remove(i); } t1.Stop("h.Remove()"); s1 = t1.GetResult("CMaaUnivHash<int, int> :\n"); __utf8_printf("%S\n", &s1); for (ihmap = hmap.begin(); ihmap != hmap.end(); ++ihmap) { std::cout << "hmap[" << ihmap->first << "]=" << ihmap->second << " "; } std::cout << '\n'; { CMaaUnivHash<int, int>::iterator it(h); for (; it; ++it) { __utf8_printf("h[%d]=%d ", it.key(), it.data()); } __utf8_printf("\n"); } return 0; } Тест 2: /* ToolsLib CMaaUnivHash is 3.5x - 15x faster than unordered_map git clone git://git.maasoftware.ru/ToolsLib.git output (Visual C++ 2010, 32 bits, Windows XP, Core2Duo E7400, 2800 MHz): q = 499999500000 q = 0 unordered_map<int, int> : 314,784 hmap.insert() 72,753 hmap.find(existed) 255,102 hmap.erase(iter) 63,864 hmap.find(not existed) 294,268 hmap.insert() 296,055 hmap.erase(val) q = 499999500000 q = 0 CMaaUnivHash<int, int> : 91,024 h.Add() 8,833 h.Find(existed) 52,243 it.Remove() 7,840 h.Find(not existed) 44,055 h.Add() 18,900 h.Remove() $ g++ -o a3.out -std=c++11 -lstdc++ -lpthread main3.cpp ../ToolsLib/ToolsLib.a output (on Linux Debian 7.6 x64 VDS, Intel Xeon E5, 2000 MHz): q = 499999500000 q = 0 unordered_map<int, int> : 577,276 hmap.insert() 170,402 hmap.find(existed) 291,785 hmap.erase(iter) 115,816 hmap.find(not existed) 590,268 hmap.insert() 213,276 hmap.erase(val) q = 499999500000 q = 0 CMaaUnivHash<int, int> : 254,875 h.Add() 36,704 h.Find(existed) 207,689 it.Remove() 30,051 h.Find(not existed) 117,712 h.Add() 89,317 h.Remove() */ #include "stdafx.h" #ifdef __unix__ #include "../ToolsLib/ToolsLib.h" #else #include "..\ToolsLib\ToolsLib.h" #endif #include <iostream> //#include <algorithm> //#include <hash_map> #include <unordered_map> int main() { typedef std::pair <int, int> ipair; std::unordered_map<int, int> hmap; std::unordered_map<int, int>::iterator ihmap, ihmap2; int i; CHrtMultiTimer t0, t1; CMaaString s0, s1; t0.Start(); for (i = 0; i < 1000000; i++) { hmap.insert(ipair(i, i)); } t0.Stop("hmap.insert()"); t0.Start(); _qword q = 0; int n = 0; for (i = 0; i < 1000000; i++) { ihmap = hmap.find(i); if (ihmap != hmap.end()) { q += ihmap->first; n++; } } t0.Stop("hmap.find(existed)"); __utf8_printf("q = %D\n", q); t0.Start(); for (ihmap = hmap.begin(); ihmap != hmap.end(); ihmap = ihmap2) { ihmap2 = ihmap; ++ihmap2; hmap.erase(ihmap); } t0.Stop("hmap.erase(iter)"); t0.Start(); q = 0; n = 0; for (i = 0; i < 1000000; i++) { ihmap = hmap.find(i+1000000); if (ihmap != hmap.end()) { q += ihmap->first; n++; } } t0.Stop("hmap.find(not existed)"); __utf8_printf("q = %D\n", q); t0.Start(); for (i = 0; i < 1000000; i++) { hmap.insert(ipair(i, i)); } t0.Stop("hmap.insert()"); t0.Start(); for (i = 0; i < 1000000; i++) { hmap.erase(i); } t0.Stop("hmap.erase(val)"); s0 = t0.GetResult("unordered_map<int, int> :\n"); __utf8_printf("%S\n", &s0); CMaaUnivHash<int, int> h; t1.Start(); for (i = 0; i < 1000000; i++) { h.Add(i, i); } t1.Stop("h.Add()"); t1.Start(); q = 0; n = 0; for (i = 0; i < 1000000; i++) { int x = 0; if (!h.Find(i, &x)) { q += x; n++; } } t1.Stop("h.Find(existed)"); __utf8_printf("q = %D\n", q); t1.Start(); CMaaUnivHash<int, int>::iterator it(h); for (; it; ++it) { it.Remove(); } t1.Stop("it.Remove()"); t1.Start(); q = 0; n = 0; for (i = 0; i < 1000000; i++) { int x = 0; if (!h.Find(i + 1000000, &x)) { q += x; n++; } } t1.Stop("h.Find(not existed)"); __utf8_printf("q = %D\n", q); t1.Start(); for (i = 0; i < 1000000; i++) { h.Add(i, i); } t1.Stop("h.Add()"); t1.Start(); for (i = 0; i < 1000000; i++) { h.Remove(i); } t1.Stop("h.Remove()"); s1 = t1.GetResult("CMaaUnivHash<int, int> :\n"); __utf8_printf("%S\n", &s1); for (ihmap = hmap.begin(); ihmap != hmap.end(); ++ihmap) { std::cout << "hmap[" << ihmap->first << "]=" << ihmap->second << " "; } std::cout << '\n'; { CMaaUnivHash<int, int>::iterator it(h); for (; it; ++it) { __utf8_printf("h[%d]=%d ", it.key(), it.data()); } __utf8_printf("\n"); } return 0; } Ratio: Back Top |
User
Новости [...] Архив новостей. New on site
Online
Guests: 0
Users: 0 Bots: 1 Total users: 7 |
We are processing with: |