|
c纯内存操作1秒完成,不知道读入和写出数据到表的时间
- /* 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++;}
- 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()
- {
- 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);
- __int64* v2;//store sum(v1);
- long t=clock();
- for (int i=0;i<1E6L;i++)
- {
- int j=i+1;
- c1[i]=j%4;
- c2[i]=j%5;
- c3[i]=j%67;
- 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;
- 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;
- }
- 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);
- 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\n",clock()-t,c);
- 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;
- }
- 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);
- 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,c1=%d,c2=%d,c3=%d,c4=%d,count=%d,sum=%I64d",clock()-t,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);
- return 0;
- }
复制代码
D:\>map2
483ms,recn=152760
577ms,recn=234600,c1=-1,c2=127,c3=127,c4=127,count=1000000,sum=500000500000 |
|