我目前使用带有scanf的循环("%d",& value),但我需要它更快。 数据量可高达2 000 000个值。有什么方法可以加快速度吗? 我读到了strtok和strtol,但我不知道如何使用它们,如果它们甚至可以达到我需要的速度。
答案 0 :(得分:5)
根据我的经验,从文件中读取大量内容的内存映射访问速度要快得多。
这可以通过
来实现 #include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags,
int fd, off_t offset);
int munmap(void *addr, size_t length);
... on * Nix和
的某种组合 CreateFileMapping
OpenFileMapping
MapViewOfFile
MapViewOfFileEx
UnmapViewOfFile
FlushViewOfFile
CloseHandle
...在Windows上(请参阅链接here。
基本上你需要类似的东西:
int fd = open( "filename" , 0 );
char* ptr = mmap( 0 , 4096*1024 // MAX FILE SIZE
, PROT_WRITE | PROT_READ , MAP_PRIVATE , fd , 0 //offset
);
// NOW READ AS IF ptr IS THE HEAD OF SOME STRING
char * thisp = ptr ;
while ( thisp != ptr+4096*1024 && *thisp ){
int some_int_you_want = strtol( thisp , &thisp , 10 );
}
munmap(ptr,4096*1024);
我不太确信上面的代码是正确的,但它应该有正确的想法....
答案 1 :(得分:4)
如果您想要仅速度并且没有错误检查,您可以创建自己的函数来获取输入并使用getchar()
将其解析为整数。
void fast_input(int* int_input)
{
*int_input=0;
char next_char=0;
while( next_char < '0' || next_char > '9' ) // Skip non-digits
next_char = getchar();
while( next_char >= '0' && next_char <= '9' )
{
(*int_input) = ((*int_input)<<1) + ((*int_input)<<3) + next_char - '0';
next_char = getchar();
}
}
int main()
{
int x;
fast_input(&x);
printf("%d\n",x);
}