|
每个分组取值增加,汇总行数增加,时间增加
- /* compiled by cl of vc2003*/
- #include <time.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <map>
- #include <iostream>
- #define add_key {if((key_recn.find(key))== key_recn.end())key_recn[key]=c++;}
- #define addkey {if((key_recn2.find(key))== key_recn2.end())key_recn2[key]=c++;}
- #define __int64 long long
- using namespace std;
- struct ltstr
- {
- bool operator()(const char* s1, const char* s2) const
- {
- return strcmp(s1, s2) < 0;
- }
- };
- struct ltint
- {
- bool operator()(const int s1, const int s2) const
- {
- return (s1<s2) ;
- }
- };
- int main()
- {
- int s[3][3]={ {4,5,67},{9,19,109},{9,97,119}};
- //printf("%d,%d",t[0][1],t[1][2]);
- //return 0;
- for(int r=0;r<3;r++)
- {
- long t=clock();
- printf("%d,%d,%d,114,%d\n",s[r][0],s[r][1],s[r][2],s[r][0]*s[r][1]*s[r][2]*114);
- char* c1=(char*)malloc(1E6L);
- char* c2=(char*)malloc(1E6L);
- char* c3=(char*)malloc(1E6L);
- char* c4=(char*)malloc(1E6L);
- int* v1=(int* )malloc(4E6L);
- printf("申请源表内存%dms\n",clock()-t);
- t=clock();
- __int64* v2;//store sum(v1);
- for (int i=0;i<1E6L;i++)
- {
- int j=i+1;
- c1[i]=j%s[r][0];
- c2[i]=j%s[r][1];
- c3[i]=j%s[r][2];
- c4[i]=(j%13?j%113:127);
- v1[i]=j;
- }
- map<const int, int, ltint> key_recn;
- map<const int, int, ltint> key_recn2;
- int c=0;
- printf("填充源表数据%dms,recn=%d,每毫秒%d行\n",clock()-t,c,(long)1E6/(clock()-t));
- t=clock();
- for (int i=0;i<1E6L;i++)
- {
- int key=(c1[i]<<24)+(c2[i]<<16)+(c3[i]<<8)+c4[i];
- //printf("key=%d\n",key);
- add_key;
- }
- printf("新建一层节点%dms,recn=%d,每毫秒读%d行,每毫秒写%d节点\n",clock()-t,c,(long)1E6/(clock()-t),c/(clock()-t));
- t=clock();
- int *C=(int*)malloc(c*4);//store count(c1)
- int *k=(int*)malloc(c*4);//store key
- v2=(__int64*)malloc(c*8);
- memset(C,0,c*4); //need?
- memset(v2,0,c*8);
- printf("申请一层内存%dms\n",clock()-t);
- t=clock();
- for (int i=0;i<1E6L;i++)
- {
- int recn=key_recn[(c1[i]<<24)+(c2[i]<<16)+(c3[i]<<8)+c4[i]];
- k[recn]=(c1[i]<<24)+(c2[i]<<16)+(c3[i]<<8)+c4[i];
- C[recn]++;
- v2[recn]=v2[recn]+v1[i];
- }
- printf("写入一层数据%dms,recn=%d,每毫秒读%d行,每毫秒写%d行\n",clock()-t,c,(long)1E6/(clock()-t),c/(clock()-t));
- t=clock();
- int c_2=c;
- for (int i=0;i<c_2;i++)
- {
- int key=(k[i]&0xFFFFFF)+((0x80+15)<<24);//set c1 null ,gid=8
- addkey;
- key=(k[i]&0xFF00FFFF)+((0x40)<<24)+(127<<16);//set c2 null,gid=4
- addkey;
- key=(k[i]&0xFFFF00FF)+((0x20)<<24)+(127<<8);//set c3 null,gid=2
- addkey;
- key=(k[i]&0xFFFFFF00)+((0x10)<<24)+(127);//set c4 null,gid=1
- addkey;
- key=(k[i]&0xFFFF00)+((0x90+15)<<24)+(127);//set c1,c4 null ,gid=9
- addkey;
- key=(k[i]&0xFF00FF00)+((0x50)<<24)+(127<<16)+(127);//set c2,c4 null,gid=5
- addkey;
- key=(k[i]&0xFFFF0000)+((0x30)<<24)+(127<<8)+(127);//set c3,c4 null,gid=3
- addkey;
- key=(k[i]&0xFF0000FF)+((0x60)<<24)+(127<<16)+(127<<8);//set c2,c3 null,gid=6
- addkey;
- key=(k[i]&0x00FF00FF)+((0xA0+15)<<24)+(127<<8);//set c1,c3 null,gid=10
- addkey;
- key=(k[i]&0xFFFF)+((0xC0+15)<<24)+(127<<16);//set c1,c2 null,gid=12
- addkey;
- key=(k[i]&0xFF00)+((0xD0+15)<<24)+(127<<16)+(127);//set c1,c2,c4 null,gid=13
- addkey;
- key=(k[i]&0xFF)+((0xE0+15)<<24)+(127<<16)+(127<<8);//set c1,c2,c3 null,gid=14
- addkey;
- key=(k[i]&0xFF0000)+((0xB0+15)<<24)+(127<<8)+(127);//set c1,c3,c4 null,gid=11
- addkey;
- key=(k[i]&0xFF000000)+((0x70)<<24)+(127<<16)+(127<<8)+(127);//set c2,c3,c4 null,gid=7
- addkey;
- key=((0xF0+15)<<24)+(127<<16)+(127<<8)+(127);//set c1,c2,c3,c4 null,gid=15
- addkey;
- }
- printf("新建后面节点%dms,recn=%d,每毫秒读%d行key,每毫秒写%d节点\n",clock()-t,c,c_2/(clock()-t),(c-c_2)/(clock()-t));
- t=clock();
- int mask[15]={
- 0x00FFFFFF,
- 0xFF00FFFF,
- 0xFFFF00FF,
- 0xFFFFFF00,
- 0x00FFFF00,
- 0xFF00FF00,
- 0xFFFF0000,
- 0xFF0000FF,
- 0x00FF00FF,
- 0x0000FFFF,
- 0x0000FF00,
- 0x000000FF,
- 0x00FF0000,
- 0xFF000000,
- 0x00000000};
- int null[15]={
- ((0x80+15)<<24),
- ((0x40)<<24)+(127<<16),
- ((0x20)<<24)+(127<<8),
- ((0x10)<<24)+(127),
- ((0x90+15)<<24)+(127),
- ((0x50)<<24)+(127<<16)+(127),
- ((0x30)<<24)+(127<<8)+(127),
- ((0x60)<<24)+(127<<16)+(127<<8),
- ((0xA0+15)<<24)+(127<<8),
- ((0xC0+15)<<24)+(127<<16),
- ((0xD0+15)<<24)+(127<<16)+(127),
- ((0xE0+15)<<24)+(127<<16)+(127<<8),
- ((0xB0+15)<<24)+(127<<8)+(127),
- ((0x70)<<24)+(127<<16)+(127<<8)+(127),
- ((0xF0+15)<<24)+(127<<16)+(127<<8)+(127)
- };
- int *C2=(int*)malloc((c-c_2)*4);//store count(c1)
- int *k2=(int*)malloc((c-c_2)*4);//store key
- __int64* v3=(__int64*)malloc((c-c_2)*8);
- memset(C2,0,(c-c_2)*4); //need?
- memset(v3,0,(c-c_2)*8);
- printf("申请后面内存%dms\n",clock()-t);
- t=clock();
- int y=0;
- for (int i=0;i<c_2;i++)
- {
- for(int j=0;j<15;j++)
- {
- int recn=key_recn2[(k[i]&mask[j])+null[j]]-c_2;
- k2[recn]=(k[i]&mask[j])+null[j];
- C2[recn]+=C[i];
- v3[recn]=v3[recn]+v2[i];
- y=recn;
- }
- }
- printf("汇总后面节点%dms,recn=%d,每毫秒读%d行,每毫秒写%d行\n",clock()-t,c,c_2/(clock()-t),(c-c_2)/(clock()-t));
- t=clock();
- /*
- printf("%fms,recn=%d,c1=%d,c2=%d,c3=%d,c4=%d,count=%d,sum=%I64d\n",(float)(clock()-t)/CLOCKS_PER_SEC ,c,
- (k2[y]>>24),((k2[y]>>16)&255),((k2[y]>>8)&255),(k2[y]&255),C2[y],v3[y]);
- */
- free(c1);
- free(c2);
- free(c3);
- free(c4);
- free(v1);
- free(v2);
- free(C);
- free(k);
- free(C2);
- free(k2);
- free(v3);
- printf("释放所有动态内存%dms\n",clock()-t);
- }
- return 0;
- }
- ~~~~~~~~~~~~~~~~~~~~~~~~~
- 4,5,67,114,152760
- 申请源表内存0ms
- 填充源表数据62ms,recn=0,每毫秒16129行
- 新建一层节点203ms,recn=152760,每毫秒读4926行,每毫秒写752节点
- 申请一层内存0ms
- 写入一层数据172ms,recn=152760,每毫秒读5813行,每毫秒写888行
- 新建后面节点250ms,recn=234600,每毫秒读611行key,每毫秒写327节点
- 申请后面内存0ms
- 汇总后面节点266ms,recn=234600,每毫秒读574行,每毫秒写307行
- 释放所有动态内存0ms
- 9,19,109,114,2124846
- 申请源表内存0ms
- 填充源表数据16ms,recn=0,每毫秒62500行
- 新建一层节点500ms,recn=941716,每毫秒读2000行,每毫秒写1883节点
- 申请一层内存0ms
- 写入一层数据296ms,recn=941716,每毫秒读3378行,每毫秒写3181行
- 新建后面节点2016ms,recn=1346870,每毫秒读467行key,每毫秒写200节点
- 申请后面内存0ms
- 汇总后面节点2344ms,recn=1346870,每毫秒读401行,每毫秒写172行
- 释放所有动态内存0ms
- 9,97,119,114,11843118
- 申请源表内存0ms
- 填充源表数据16ms,recn=0,每毫秒62500行
- 新建一层节点437ms,recn=1000000,每毫秒读2288行,每毫秒写2288节点
- 申请一层内存0ms
- 写入一层数据219ms,recn=1000000,每毫秒读4566行,每毫秒写4566行
- 新建后面节点3063ms,recn=2299600,每毫秒读326行key,每毫秒写424节点
- 申请后面内存0ms
- 汇总后面节点3406ms,recn=2299600,每毫秒读293行,每毫秒写381行
- 释放所有动态内存0ms
复制代码 |
|