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

Sim*_*mon 0 c

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

Anm*_*ggi 6

如果您只需要速度而不需要错误检查,您可以创建自己的函数来获取输入并将其解析为整数,使用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);
}  
Run Code Online (Sandbox Code Playgroud)

  • 如果不担心锁定并且平台符合 posix,则可以使用`getchar_unlocked`。神奇的数字,如 47、48、57、58 [看起来很糟糕](http://stackoverflow.com/questions/47882/what-is-a-magic-number-and-why-is-it-bad)。更好地替换为“0”、“9”等。解决方案也适用于 ascii 输入。 (3认同)

pho*_*gon 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);
Run Code Online (Sandbox Code Playgroud)

......在*Nix和某些组合上

 CreateFileMapping
 OpenFileMapping
 MapViewOfFile
 MapViewOfFileEx
 UnmapViewOfFile
 FlushViewOfFile
 CloseHandle
Run Code Online (Sandbox Code Playgroud)

...在Windows上(请参阅此处的链接.

基本上你想要的东西:

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);
Run Code Online (Sandbox Code Playgroud)

我不是很确信上面的代码是正确的,但它应该有正确的想法....


归档时间:

查看次数:

163 次

最近记录:

11 年,4 月 前