楼主: 〇〇

[有奖问答] 用过程语言实现group by cube的代码挑战赛

[复制链接]
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
11#
发表于 2010-2-24 06:19 | 只看该作者

主要就是AGG的开销。

再来一版,层层叠加:

DECLARE
   TYPE t_num IS TABLE OF NUMBER INDEX BY VARCHAR2(42);
   lv_rownum t_num;
   TYPE t_row IS TABLE OF yourcube%ROWTYPE;
   lv_result t_row := t_row();
      
   cursor c is SELECT * FROM T;
   
   TYPE t_row2 IS TABLE OF c%ROWTYPE;
   lv_row t_row2;
   lv_cnt NUMBER;
   lv_cnt2 NUMBER;
   PROCEDURE agg (p_c1 IN NUMBER,p_c2 IN NUMBER,p_c3 IN NUMBER, p_c4 IN NUMBER, p_v IN NUMBER, p_c IN NUMBER, p_gid IN NUMBER)
   IS
      lv_idx NUMBER;
      lv_key VARCHAR2(42) := LPAD(NVL(TO_CHAR(p_c1),' '),10)||LPAD(NVL(TO_CHAR(p_c2),' '),10)||LPAD(NVL(TO_CHAR(p_c3),' '),10)||LPAD(NVL(TO_CHAR(p_c4),' '),10)||LPAD(p_gid,2);
   BEGIN
       BEGIN
          lv_idx := lv_rownum(lv_key);
          IF p_v IS NOT NULL THEN
             lv_result(lv_idx).sv := NVL(lv_result(lv_idx).sv,0) + p_v;
          END IF;

       EXCEPTION
          WHEN NO_DATA_FOUND THEN
               lv_idx := lv_rownum.COUNT+1;
               IF lv_idx>lv_result.COUNT THEN
                  lv_result.EXTEND(10000);
               END IF;
               lv_rownum(lv_key) := lv_idx;
               lv_result(lv_idx).c1 := p_c1;
               lv_result(lv_idx).c2 := p_c2;
               lv_result(lv_idx).c3 := p_c3;
               lv_result(lv_idx).c4 := p_c4;
               lv_result(lv_idx).sv := p_v;
               lv_result(lv_idx).gid := p_gid;
               lv_result(lv_idx).cv := 0;
       END;
       lv_result(lv_idx).cv := lv_result(lv_idx).cv + p_c;
      
   END agg;
BEGIN
    OPEN c;
    LOOP
        FETCH c BULK COLLECT INTO lv_row LIMIT 1000;
        FOR I IN 1..lv_row.COUNT LOOP
            agg(lv_row(I).c1,lv_row(I).c2,lv_row(I).c3,lv_row(I).c4,lv_row(I).v,CASE WHEN lv_row(I).v IS NULL THEN 0 ELSE 1 END,0);
        END LOOP;
        EXIT WHEN C%NOTFOUND;
    END LOOP;
    CLOSE C;
    lv_cnt := lv_rownum.COUNT;
   
    FOR I IN 1..lv_cnt LOOP
            agg(lv_result(I).c1,lv_result(I).c2,lv_result(I).c3,NULL           ,lv_result(I).sv,lv_result(I).cv,1);
            agg(lv_result(I).c1,lv_result(I).c2,NULL           ,lv_result(I).c4,lv_result(I).sv,lv_result(I).cv,2);
            agg(lv_result(I).c1,NULL           ,lv_result(I).c3,lv_result(I).c4,lv_result(I).sv,lv_result(I).cv,4);
            agg(NULL           ,lv_result(I).c2,lv_result(I).c3,lv_result(I).c4,lv_result(I).sv,lv_result(I).cv,8);
    END LOOP;
   
    lv_cnt := lv_cnt +1;
    lv_cnt2 := lv_rownum.COUNT;

    FOR I IN lv_cnt..lv_cnt2 LOOP
        IF lv_result(I).gid = 1 THEN
            agg(lv_result(I).c1,lv_result(I).c2,NULL           ,NULL           ,lv_result(I).sv,lv_result(I).cv,3);
            agg(lv_result(I).c1,NULL           ,lv_result(I).c3,NULL           ,lv_result(I).sv,lv_result(I).cv,5);
            agg(NULL           ,lv_result(I).c2,lv_result(I).c3,NULL           ,lv_result(I).sv,lv_result(I).cv,9);
        ELSIF lv_result(I).gid = 2 THEN
            agg(NULL           ,lv_result(I).c2,NULL           ,lv_result(I).c4,lv_result(I).sv,lv_result(I).cv,10);
        ELSIF lv_result(I).gid = 4 THEN
            agg(lv_result(I).c1,NULL           ,NULL           ,lv_result(I).c4,lv_result(I).sv,lv_result(I).cv,6);
            agg(NULL           ,NULL           ,lv_result(I).c3,lv_result(I).c4,lv_result(I).sv,lv_result(I).cv,12);
        END IF;
    END LOOP;

    lv_cnt := lv_cnt2 +1;
    lv_cnt2 := lv_rownum.COUNT;

    FOR I IN lv_cnt..lv_cnt2 LOOP
        IF lv_result(I).gid = 3 THEN
            agg(lv_result(I).c1,NULL           ,NULL           ,NULL           ,lv_result(I).sv,lv_result(I).cv,7);
            agg(NULL           ,lv_result(I).c2,NULL           ,NULL           ,lv_result(I).sv,lv_result(I).cv,11);
            agg(NULL           ,NULL           ,NULL           ,NULL           ,lv_result(I).sv,lv_result(I).cv,15);
        ELSIF lv_result(I).gid = 5 THEN
            agg(NULL           ,NULL           ,lv_result(I).c3,NULL           ,lv_result(I).sv,lv_result(I).cv,13);
        ELSIF lv_result(I).gid = 6 THEN
            agg(NULL           ,NULL           ,NULL           ,lv_result(I).c4,lv_result(I).sv,lv_result(I).cv,14);
        END IF;
    END LOOP;
   
    FORALL I IN 1..lv_rownum.COUNT
        INSERT INTO yourcube VALUES lv_result(i);
END;
/

PL/SQL procedure successfully completed.

Elapsed: 00:00:23.12




[ 本帖最后由 newkid 于 2010-2-24 06:35 编辑 ]

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
12#
发表于 2010-2-24 06:29 | 只看该作者
用GROUP BY CUBE生成TCUBE是9秒多。
我偷偷把我的游标改成cursor c is SELECT C1,C2,C3,C4,SUM(V) SV,COUNT(V) CV FROM T GROUP BY c1,c2,c3,c4;
结果13秒就完成了。

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
13#
 楼主| 发表于 2010-2-24 08:25 | 只看该作者
我把11楼
lv_key VARCHAR2(42) := LPAD(NVL(TO_CHAR(p_c1),' '),10)||LPAD(NVL(TO_CHAR(p_c2),' '),10)||LPAD(NVL(TO_CHAR(p_c3),' '),10)||LPAD(NVL(TO_CHAR(p_c4),' '),10)||LPAD(p_gid,2);
改成
lv_key VARCHAR2(42) := LPAD(NVL(TO_CHAR(p_c1),' '),1)||LPAD(NVL(TO_CHAR(p_c2),' '),1)||LPAD(NVL(TO_CHAR(p_c3),' '),2)||LPAD(NVL(TO_CHAR(p_c4),' '),3)||LPAD(p_gid,2);

25.08 减少到 21.71

改成
lv_key VARCHAR2(9) := NVL(TO_CHAR(p_c1),' ')||NVL(TO_CHAR(p_c2),' ')||LPAD(NVL(TO_CHAR(p_c3),' '),2)||LPAD(NVL(TO_CHAR(p_c4),' '),3)||LPAD(p_gid,2);

减少到 19.70
改成(我的数据恰好都在0-126之间)
lv_key VARCHAR2(5) := chr(NVL(p_c1,127))||chr(NVL(p_c2,127))||chr(NVL(p_c3,127))||chr(NVL(p_c4,127))||chr(p_gid);减少到 14.72

又把agg里的WHEN NO_DATA_FOUND THEN异常处理改为if lv_rownum.exists(lv_key) then
没有变化
在aix 4.4G cpu 上
group by cube 7.75秒,11楼plsql反而26.06比pc服务器还慢,不理解

[ 本帖最后由 〇〇 于 2010-2-24 15:20 编辑 ]

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
14#
 楼主| 发表于 2010-2-24 09:34 | 只看该作者
不知道这个
http://download.oracle.com/otn/java/olap/awm112010_standalone.zip
建立cube是什么算法?

使用道具 举报

回复
论坛徽章:
14
2009新春纪念徽章
日期:2009-01-04 14:52:28沸羊羊
日期:2015-03-04 14:51:52优秀写手
日期:2014-03-14 06:00:13马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-06-27 21:08:142012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
15#
发表于 2010-2-24 14:51 | 只看该作者
原帖由 〇〇 于 2010-2-24 09:34 发表
不知道这个
http://download.oracle.com/otn/java/olap/awm112010_standalone.zip
建立cube是什么算法?

你把那个C程序试一下如何?结果对否?速度如何?

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
16#
 楼主| 发表于 2010-2-24 15:22 | 只看该作者

回复 #15 yulihua49 的帖子

你那个C程序需要改写才能适合这道题,我没看太懂,改不出来,请您改改

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
17#
 楼主| 发表于 2010-2-24 15:25 | 只看该作者

回复 #11 newkid 的帖子

我分别测试各层,第一层9秒,第1+2层13.52秒,后面的几乎不花时间

有趣的是,同样对第一层扫描
agg(lv_result(I).c1,lv_result(I).c2,lv_result(I).c3,NULL           ,lv_result(I).sv,lv_result(I).cv,1);

agg(NULL           ,lv_result(I).c2,lv_result(I).c3,lv_result(I).c4,lv_result(I).sv,lv_result(I).cv,8);
快多了
看来还跟列的取值范围有关。

[ 本帖最后由 〇〇 于 2010-2-24 15:31 编辑 ]

使用道具 举报

回复
论坛徽章:
14
2009新春纪念徽章
日期:2009-01-04 14:52:28沸羊羊
日期:2015-03-04 14:51:52优秀写手
日期:2014-03-14 06:00:13马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-06-27 21:08:142012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
18#
发表于 2010-2-24 17:06 | 只看该作者
原帖由 〇〇 于 2010-2-24 15:22 发表
你那个C程序需要改写才能适合这道题,我没看太懂,改不出来,请您改改

我试了,是group by cube快。
用的我的那个tjrb,7552个记录:
SELECT unit,tabname,flg,count(*) count,sum(dat1) s,avg(dat1) ag FROM TICKET.tjrb GROUP BY CUBE (unit,tabname,flg)
18ms,
树group,70ms
没有null的,二者结果完全相同。共归并出552项


  1. main(int argc,char **argv)
  2. {
  3. cube_stu cube;
  4. TJRB_stu tjrb;
  5. DAU tjrb_DAU,cube_DAU;
  6. T_SQL_Connect SQL_Connect;
  7. int ret,num=0;
  8. char stmt[4096];
  9. INT64 now;
  10. T_PkgType tj_tpl[5];
  11. struct t_node node;
  12. T_Tree *root=0;

  13.         if(argc>1) ret=envcfg(argv[1]);
  14.         ret=db_open(&SQL_Connect);
  15.         if(ret) {
  16.                 printf("%s,dbopen error\n",argv[0]);
  17.                 return 1;
  18.         }
  19.         patt_copy(tj_tpl,TJRB_tpl,"unit,tabname,flg,dat1");
  20.         DAU_init(&tjrb_DAU,&SQL_Connect,0,&tjrb,tj_tpl);
  21. //测试树group
  22.         node.num=#
  23.         now=now_usec();
  24.         *stmt=0;
  25.         ret=DAU_prepare(&tjrb_DAU,stmt);
  26.         ShowLog(5,"%s:stmt=%s",__FUNCTION__,stmt);
  27.         if(ret!=0) {
  28.                 printf("%s,err=%d,%s\n",stmt,
  29.                         SQL_Connect.Errno,
  30.                         SQL_Connect.ErrMsg);
  31.         } else {
  32.                 while(!DAU_next(&tjrb_DAU)) {
  33.                         node.count=1;
  34.                         node.s=tjrb.dat1;
  35.                         *node.unit=0;
  36.                         *node.tabname=0;
  37.                         node.flg=SHORTNULL;
  38.                         root=BB_Tree_Add(root,&node,sizeof(node),cmp,add_dup); //000
  39.                         node.flg=tjrb.flg;
  40.                         root=BB_Tree_Add(root,&node,sizeof(node),cmp,add_dup); //001
  41.                         strcpy(node.tabname,tjrb.tabname);
  42.                         root=BB_Tree_Add(root,&node,sizeof(node),cmp,add_dup); //011
  43.                         node.flg=SHORTNULL;
  44.                         root=BB_Tree_Add(root,&node,sizeof(node),cmp,add_dup); //010
  45.                         strcpy(node.unit,tjrb.unit);
  46.                         root=BB_Tree_Add(root,&node,sizeof(node),cmp,add_dup); //110
  47.                         node.flg=tjrb.flg;
  48.                         root=BB_Tree_Add(root,&node,sizeof(node),cmp,add_dup); //111
  49.                         *node.tabname=0;
  50.                         root=BB_Tree_Add(root,&node,sizeof(node),cmp,add_dup); //101
  51.                         node.flg=SHORTNULL;
  52.                         root=BB_Tree_Add(root,&node,sizeof(node),cmp,add_dup); //100
  53.                 }
  54.                 if(root) {
  55.                         BB_Tree_Scan(root,avg);
  56.                         BB_Tree_Scan(root,print_node);
  57.                         BB_Tree_Free(&root,0);
  58.                 }
  59.                 printf("num=%d,TIMEVAL=%lld\n",num,now_usec()-now);
  60.         }
  61.         DAU_free(&tjrb_DAU);
  62. //测试CUBE
  63.         num=0;
  64.         DAU_init(&cube_DAU,&SQL_Connect,0,&cube,cube_tpl);
  65.         now=now_usec();
  66.         strcpy(stmt,"GROUP BY CUBE (unit,tabname,flg)");
  67.         ret=DAU_prepare(&cube_DAU,stmt);
  68.         ShowLog(5,"%s:stmt=%s",__FUNCTION__,stmt);
  69.         if(ret!=0) {
  70.                 printf("%s,err=%d,%s\n",stmt,
  71.                         SQL_Connect.Errno,
  72.                         SQL_Connect.ErrMsg);
  73.         } else {
  74.                 while(!DAU_next(&cube_DAU)) {
  75.                         num++;
  76.                         DAU_pack(&cube_DAU,stmt);
  77.                         printf("%s\n",stmt);
  78.                 }
  79.         }
  80.         printf("num=%d,TIMEVAL=%lld\n",num,now_usec()-now);

  81.         DAU_free(&cube_DAU);
  82.         ___SQL_CloseDatabase__(&SQL_Connect);
  83.         return 0;
  84. }
  85. //附cube模板:
  86. T_PkgType cube_tpl[]={
  87.         {CH_CHAR,9,"unit",0,-1},
  88.         {CH_CHAR,9,"tabname"},
  89.         {CH_SHORT,sizeof(short),"flg"},
  90.         {CH_INT,sizeof(int),"count(*) count"},
  91.         {CH_INT64,sizeof(INT64),"sum(dat1) s"},
  92.         {CH_DOUBLE,sizeof(double),"avg(dat1) ag","%.2lf"},
  93.         {-1,0,"tjrb","tjdate|unit|tabname|flg|"}
  94. };

  95. extern T_PkgType cube_tpl[];
  96. typedef struct {
  97.         char unit[9];
  98.         char tabname[9];
  99.         short flg;
  100.         int count;
  101.         INT64 s;
  102.         double ag;
  103. } cube_stu;


复制代码

[ 本帖最后由 yulihua49 于 2010-2-24 17:15 编辑 ]

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
19#
 楼主| 发表于 2010-2-24 20:17 | 只看该作者

实现了不带cube的group by

  1. /* compiled by cl of vc2003*/
  2. #include <time.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <map>
  6. #include <iostream>
  7. using namespace std;
  8. struct ltstr
  9. {
  10.   bool operator()(const char* s1, const char* s2) const
  11.   {
  12.     return strcmp(s1, s2) < 0;
  13.   }
  14. };
  15. struct ltint
  16. {
  17.   bool operator()(const int s1, const int s2) const
  18.   {
  19.     return (s1<s2) ;
  20.   }
  21. };
  22. int main()
  23. {
  24. char* c1=(char*)malloc(1E6L);
  25. char* c2=(char*)malloc(1E6L);
  26. char* c3=(char*)malloc(1E6L);
  27. char* c4=(char*)malloc(1E6L);
  28. int*  v1=(int* )malloc(4E6L);
  29. __int64* v2;//store sum(v1);
  30. long t=clock();
  31. for (int i=0;i<1E6L;i++)
  32. {
  33.         int j=i+1;
  34.         c1[i]=j%4;
  35.         c2[i]=j%5;
  36.         c3[i]=j%67;
  37.         c4[i]=(j%13?j%113:127);
  38.         v1[i]=j;
  39. }


  40. map<const int, int, ltint> key_recn;
  41. int c=0;
  42. for (int i=0;i<1E6L;i++)
  43. {
  44.         int key=(c1[i]<<24)+(c2[i]<<16)+(c3[i]<<8)+c4[i];
  45.         //printf("key=%d\n",key);
  46.         if((key_recn.find(key))== key_recn.end())
  47.                 key_recn[key]=c++;
  48. }


  49. int *C=(int*)malloc(c*4);//store count(c1)
  50. int *k=(int*)malloc(c*4);//store key

  51. v2=(__int64*)malloc(c*8);
  52. /*
  53. memset(C,0,c*4); //need?
  54. memset(v2,0,c*8);
  55. */

  56. for (int i=0;i<1E6L;i++)
  57. {
  58. int recn=key_recn[(c1[i]<<24)+(c2[i]<<16)+(c3[i]<<8)+c4[i]];
  59. k[recn]=(c1[i]<<24)+(c2[i]<<16)+(c3[i]<<8)+c4[i];
  60. C[recn]++;
  61. v2[recn]=v2[recn]+v1[i];

  62. }
  63. int d=
  64. printf("%dms,recn=%d,c1=%d,c2=%d,c3=%d,c4=%d,count=%d,sum=%ld",clock()-t,c,
  65. (k[c-1]>>24),((k[c-1]>>16)&255),((k[c-1]>>8)&255),(k[c-1]&255),C[c-1],v2[c-1]);

  66. free(c1);
  67. free(c2);
  68. free(c3);
  69. free(c4);
  70. free(v1);
  71. free(v2);
  72. free(C);
  73. free(k);
  74. return 0;

  75. }
复制代码


输出
D:\>map
1250ms,recn=152760,c1=3,c2=1,c3=58,c4=104,count=5,sum=3028355

验证
SQL> select count(*) from tcube where gid=0;

  COUNT(*)
----------
    152760


         
         
SQL> select * from tcube where gid=0 and c1=3 and c2=1 and c3=58 and c4=104;

        C1         C2         C3         C4         SV         CV        GID
---------- ---------- ---------- ---------- ---------- ---------- ----------
         3          1         58        104    3028355          5          0

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
20#
 楼主| 发表于 2010-2-24 20:45 | 只看该作者
照搬newkid的思路
19楼用cl /02 编译输出
D:\>cl /O2 map.cpp /EHsc
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.

map.cpp
Microsoft (R) Incremental Linker Version 7.10.3077
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:map.exe
map.obj

D:\>map
421ms,recn=152760,c1=3,c2=1,c3=58,c4=104,count=5,sum=3028355      

生成第一层的时间,不包括从数据库读的时间

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表