我目前使用带有scanf的循环("%d",&value),但我需要它更快.数据量可高达2 000 000个值.有什么方法可以加快速度吗?我读到了strtok和strtol,但我不知道如何使用它们,如果它们甚至可以达到我需要的速度.
如果您只需要速度而不需要错误检查,您可以创建自己的函数来获取输入并将其解析为整数,使用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)
根据我的经验,内存映射访问从文件中读取大量内容要快得多.
这可以通过以下方式实现
#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 次 |
最近记录: |