C - 读取大量整数的最快方法?

时间:2014-05-26 01:14:55

标签: c

我目前使用带有scanf的循环("%d",& value),但我需要它更快。 数据量可高达2 000 000个值。有什么方法可以加快速度吗? 我读到了strtok和strtol,但我不知道如何使用它们,如果它们甚至可以达到我需要的速度。

2 个答案:

答案 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);
}