libsava 範囲クエリのベンチとか

さっきの続きです。
begin, endがどんな感じで動くのか試してみました。
ベンチをとるために、mistライブラリの中にあった、mist::timer を使ってみました。
libsava にも時間測定用のクラスがあるようですが、unix用っぽいので、そっちは使ってません。
ついでにoptimize 関数も試したかったのですが、コンパイルが通りませんorz

Pentium4 2.4GHz
Visual Studio 2005 Express Edition Release モード 特に最適化オプションはいじってないです

で、出力は
173166件挿入...3.51578秒
3.7,4.1,1:15.17
5.3,4.1,1:21.73
3.7,4.1,2:30.34
3.7,6.4,1:23.68
3.7,8.7,1:32.19
3.7,6.4,2:47.36
3.7,11,1:40.7
3.7,13.3,1:49.21
3.7,8.7,2:64.38
3.7,11,2:81.4
3.7,13.3,2:98.42
5.3,6.4,1:33.92
5.3,4.1,2:43.46
5.3,8.7,1:46.11
5.3,11,1:58.3
5.3,13.3,1:70.49
5.3,6.4,2:67.84
5.3,8.7,2:92.22
5.3,11,2:116.6
5.3,13.3,2:140.98
6.9,4.1,1:28.29
8.5,4.1,1:34.85
6.9,6.4,1:44.16
6.9,4.1,2:56.58
8.5,4.1,2:69.7
8.5,6.4,1:54.4
6.9,8.7,1:60.03
8.5,8.7,1:73.95
6.9,6.4,2:88.32
8.5,6.4,2:108.8
6.9,11,1:75.9
8.5,11,1:93.5
6.9,13.3,1:91.77
6.9,8.7,2:120.06
6.9,11,2:151.8
6.9,13.3,2:183.54
8.5,13.3,1:113.05
8.5,8.7,2:147.9
8.5,11,2:187
8.5,13.3,2:226.1
22480.8 クエリ...0.00130173秒

となりました。ラスター走査っぽい順になることを期待したのですが、順番の規則性は考えちゃだめなんでしょうかねぇ?

// ソースここから
#include <libsava/spatial/KDTree.h>
#include <mist/timer.h>
#include <string>
#include <iostream>

using namespace sava::spatial;

typedef Point3D<double> point_type;
typedef KDTree<point_type, double, 3> Tree;

double sum;
void sum_xyz(std::pair<point_type, double> v){
  sum += v.first[0] + v.first[1] + v.first[2];
}

void print(std::pair<point_type, double> v){
  std::cout << v.first[0] << "," << v.first[1] << "," << v.first[2] << ":" << v.second << std::endl;
}

int main(){
  Tree kdt;
  {
    mist::timer time;
    for (double k = 1.0; k < 3.0; k += 1.0){
      for (double j = 1.8; j < 500.0; j += 2.3){
        for (double i = 2.1; i < 640.0; i += 1.6){
          kdt.insert(point_type(i,j,k), i*j*k);
        }
      }
    }
    std::cout << kdt.size() << "件挿入..." << time << "秒" << std::endl;
  }

  std::for_each(kdt.begin(point_type(3.0,3.0,1.0), point_type(10.0,15.0,3.0)), kdt.end(), &print);

//  {
//    mist::timer time;
//    kdt.optimize();
//    std::cout << " 最適化..." << time << "秒" << std::endl;
//  }

  {
    mist::timer time;
    sum = 0.0;
    std::for_each(kdt.begin(point_type(3.0,3.0,1.0), point_type(50.0,40.0,1.0)), kdt.end(), &sum_xyz);
    std::cout << sum << " クエリ..." << time << "秒" << std::endl;
  }

  std::string s;
  std::getline(std::cin, s);
}