#define NOHASH 1 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include typedef CGAL::Simple_cartesian Kernel; typedef Kernel::Point_3 Point_3; typedef Kernel::Vector_3 Vector_3; typedef CGAL::Timer Timer; template void run(const G& g) { typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; typedef typename boost::property_map::const_type VPM; VPM vpm = get(CGAL::vertex_point,g); std::vector V, V2; std::vector P1, P2; for(vertex_descriptor vd : vertices(g)){ V.push_back(vd); V2.push_back(vd); } boost::rand48 random; boost::random_number_generator rng(random); std::random_shuffle(V.begin(), V.end(), rng); Timer t; #if 0 t.start(); Map vm; for(vertex_descriptor vd : V){ vm[vd] = get(vpm,vd); } t.stop(); std::cerr << "Insertion: " << t.time() << " sec. " << std::endl; #endif Vector_3 v(0,0,0); std::size_t st=0; #if 0 std::cerr << "foreach std::vector::vertex_iterator> r = vertices(g); for(vertex_descriptor vd : r) { #ifdef NOHASH st += std::size_t(vd); // v = v + (get(vpm,vd) - CGAL::ORIGIN); #else typename Map::iterator it = vm.find(vd); v = v + ((*it).second - CGAL::ORIGIN); #endif } } t.stop(); std::cerr << " " <::vertex_iterator> ir = vertices(g); for(vertex_descriptor vd : ir) { #ifdef NOHASH st += std::size_t(vd); //v = v + (get(vpm,vd) - CGAL::ORIGIN); #else typename Map::iterator it = vm.find(vd); v = v + ((*it).second - CGAL::ORIGIN); #endif } } t.stop(); std::cerr << " " <::vertex_iterator vb, ve; boost::tie(vb,ve) = vertices(g); for(; vb != ve; ++vb) { vertex_descriptor vd = *vb; #ifdef NOHASH st += std::size_t(vd); //v = v + (get(vpm,vd) - CGAL::ORIGIN); #else typename Map::iterator it = vm.find(vd); v = v + ((*it).second - CGAL::ORIGIN); #endif } } t.stop(); std::cerr << " " < Mesh; typedef boost::graph_traits::vertex_descriptor vertex_descriptor; typedef std::map SM; typedef std::unordered_map SUM; typedef boost::unordered_map BUM; Mesh m; std::ifstream input(argv[1]); input >> m; std::cerr << num_vertices(m) << " items\n"; std::cerr << "\nSurface_mesh std::map"<< std::endl; run(m); #if 0 std::cerr << "\nSurface_mesh std::unordered_map"<< std::endl; run(m); std::cerr << "\nSurface_mesh boost::unordered_map"<< std::endl; run(m); #endif } #if 0 { typedef CGAL::Polyhedron_3 Mesh; typedef boost::graph_traits::vertex_descriptor vertex_descriptor; typedef std::map SM; typedef std::unordered_map SUM; typedef boost::unordered_map BUM; Mesh m; std::ifstream input(argv[1]); input >> m; std::cerr << "\nPolyhedron_3 std::map" << std::endl; run(m); std::cerr << "\nPolyhedron_3 std::unordered_map"<< std::endl; run(m); std::cerr << "\nPolyhedron_3 boost::unordered_map"<< std::endl; run(m); } { const int N = 3165798; std::cerr << "\nHashing "<< N << " pointers\n"; std::vector ints(N); std::vector data(N); for(int i =0; i um; Timer t; t.start(); for(int i= 0; i < N; i++){ um[& (data[ints[i]])] = i; } t.stop(); std::cerr << " boost::unordered_map: " << t.time() << " sec.\n"; } { std::unordered_map um; Timer t; t.start(); for(int i= 0; i < N; i++){ um[& (data[ints[i]])] = i; } t.stop(); std::cerr << " std::unordered_map: " << t.time() << " sec.\n"; } } #endif return 0; }