这还有优化空间吗

P10815 【模板】快速读入

@[2056271443qq](/user/1125000) 有,把getch() 压行后define化,快多了
by cj180202 @ 2024-08-18 15:18:50


缓冲区再大些,建议 $2^{20}$
by cj180202 @ 2024-08-18 15:20:21


@[cj180202](/user/709361) 本蒟蒻太菜了,不会三元表达式啊,这就去baidu
by 2056271443qq @ 2024-08-18 15:22:31


@[cj180202](/user/709361) 2^16是我调出来的,2^20慢0.01s
by 2056271443qq @ 2024-08-18 15:23:51


@[2056271443qq](/user/1125000) 有,而且很大,用linux函数 `mmap` 直接文件映射,比fread快的多,用法自行bd。
by Green_Leaves @ 2024-08-19 11:47:31


@[Green_Leaves](/user/1375749) 百度了,但你这是文件映射,没法映射终端啊,你谷也没给出读入文件名称
by 2056271443qq @ 2024-08-19 12:40:53


stdin的文件描述符是1,有一个函数可以从文件指针获取描述符,忘了叫什么了 @[2056271443qq](/user/1125000)
by Green_Leaves @ 2024-08-19 14:31:03


我之前写的,才翻出来加了注释: ```cpp auto fd=fileno(stdin);//获取文件描述符 struct stat m_stat; fstat(fd, &m_stat);//获取文件信息 int in_buf_len=m_stat.st_size;//文件长度 char* buf_i=(char*)(mmap(NULL,in_buf_len,PROT_READ,MAP_PRIVATE,fd,0));//创建映射 ```
by Green_Leaves @ 2024-08-19 14:36:42


文件长度以字符数为单位
by Green_Leaves @ 2024-08-19 14:37:31


@[2056271443qq](/user/1125000) 708ms ```cpp #include <cstdint> #include <cstring> #include <iostream> #include <sys/mman.h> #include <sys/stat.h> main() { struct stat st;auto f=fileno(stdin);fstat(f,&st);auto c=(char*)mmap(nullptr,st.st_size,PROT_READ,MAP_PRIVATE,f,0); auto n=0u;while (*c>='0')n=n*10+(*c++-'0');++c;++c; int s=0; unsigned a[0x10000],v,p; memset(a, -1, 0x40000); for(int i='0';i<='9';i++)for(int j='0';j<='9';j++)a[(i<<8)+j]=(j-'0')*10+(i-'0'); for(;n--;c++) { v=0,p=0; c+=p=*c=='-'; while(~a[*(uint16_t*)(c)])v=v*100+a[*(uint16_t*)(c)],c+=2; if(*c>='0')v=v*10+((*c++)^'0'); s+=p?-v:v; } printf("%d",s); } ```
by nr0728 @ 2024-09-05 11:10:13


|