Linux 小知识
一些指令
🛠️ 编译运行代码
编译代码:g++ temp.cpp -o temp。生成类似 .exe 的东西(没有后缀名)。
运行:./temp。或者是 time ./temp,会输出三个时间:\(\text{real, user, sys}\),评测机判题看的是 \(\text{real}\) 所以一般也只看 \(\text{real}\)。
可以合在一起:g++ temp.cpp -o temp && time ./temp。或者g++ temp.cpp -o temp -std=c++14 -O2 -g -Wall -Wextra -fsanitize=address,undefined && time ./temp。
- 其中
Wall生成所有警告信息。 Wextra打印额外(可能您并不想要)的警告信息,这个是个好东西,变量没用到、逻辑判断没生效(例如a=0写成a==0)、用两个不同类型变量比较,都会提醒。- 后面串似乎没什么用。加不加无所谓。
在 ./temp 后面加> 1.in 和 < 1.out 可以实现 freopen。
diff 1.out. 1.ans 比较两个文件是否相同。
-Z忽略行末空字符。(推荐)-w忽略所有空白字符(包括空格,换行)。-b忽略所有空格变化。
📊 time 输出三个时间含义
| 时间类型 | 描述 | 包含内容 |
|---|---|---|
| real | 从进程开始到完成的总时间 | 进程实际使用的 CPU 时间 • 进程阻塞时间(如 I/O 等待) • 其他进程占用时间(可能会有别的进程抢占 CPU) |
| user | 进程用户态代码执行时间 | 仅进程实际使用的 CPU 时间 • 不包括其他进程时间 • 不包括进程阻塞时间 |
| sys | 进程内核态运行时间 | 执行内核系统调用的 CPU 时间 |
下图中未使用 freopen,进行手写输入输出,\(\text{real}\) 有 \(6s\) 而 \(\text{user}\) 只有 \(0.003s\)。所以 freopen 是很有必要的。
分析: 这表明程序大部分时间花费在 I/O 等待上,实际 CPU 计算时间很短。
对拍
由四个东西组成,gen.cpp, ac.cpp, run.cpp, dp.bash。分别是随机数生成器、正确代码、对拍代码以及一个 bash。
gen.cpp
#include <bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(0), cin.tie(0);
mt19937 rnd(chrono::steady_clock().now().time_since_epoch().count()); // 精度极高的时间函数,听说是纳米级别?不清楚
cout << (n = rnd() % 100 + 1) << '\n';
//...
return 0;
}
bash
运行 bash 前需添加可执行权限。使用 chmod + x 文件名。

g++ gen.cpp -o gen -std=c++14 -O2
g++ ac.cpp -o ac -std=c++14 -O2
g++ run.cpp -o run -std=c++14 -O2
t=0
while true; do
let t++
echo "###"$t
./gen > test.in
./ac < test.in > ans.out
timeout 1 ./run < test.in > test.out
if [ "$?" -ne 0 ]; then
echo "TLE"
exit 1
fi
if diff ans.out test.out -Z; then
echo "AC"
else
echo "WA"
exit 2
fi
done
来解释一下,方便背诵。
-
前面三行用来生成可执行文件(windows 中的 exe)。
-
echo是输出(cout),$t是用来输出 \(t\) 这个数字而不是字母t。\(t\) 表示拍了几组。 -
./gen > test.in生成随机数据到test.in。 -
timeout 1.5 ./run < test.in > test.out是运行run.cpp并检查是否超时(\(1.5\) 可替换为其他的。判断的是real时间) -
如果超时输出
TLE并退出程序 。if [ "$?" -ne 0 ]; then echo "TLE" exit 1 -
否则比较两个输出是否相同。
浙公网安备 33010602011771号