touch fish 15
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
static void XorAligned(benchmark::State &state) { std::vector<char> v{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; std::vector<char> tar(300, 1); for (auto _ : state) { int id = 0; for (; id < tar.size(); id += 8) { auto data = reinterpret_cast<int64_t *>(&tar[id]); *data ^= *reinterpret_cast<int64_t *>(v.data()); benchmark::DoNotOptimize(data); } for (int cnt = 0; id < tar.size(); id++, cnt++) { tar[id] ^= v[cnt % v.size()]; benchmark::DoNotOptimize(tar); } } } BENCHMARK(XorAligned); static void XorEachByte(benchmark::State &state) { std::vector<char> v{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; std::vector<char> tar(300, 1); for (auto _ : state) { for (int i = 0; i < tar.size(); i++) { tar[i] ^= v[i % v.size()]; benchmark::DoNotOptimize(tar); } } } BENCHMARK(XorEachByte);
- 溢出、异常、线程池、阻塞,奇怪的服务重启问题定位
真的恶心,async拿到的future里面的异常,不会抛出,只会在get的时候抛出。
- cast ub to int
int - size_t, int会被cast成size_t, 如果int是个负数,那么cast成size_t就会变成一个很大的数,所以c++里要注意int - vector.size()这种情况。
- to_string会抛异常
to_string会抛异常,如果是个非法的数字,比如inf,nan,或者超过了long long的范围。你可以考虑用istringstream来代替to_string, 但是这个多线程会那std::locale的问题, 可能会有点竞争问题。
- Beej’s Guide to Network Programming
- string with null terminated
其实老生常谈了,数据层的str有\0我觉得还挺常见的
- 长连接黑洞
一句话,别用默认的net.ipv4.tcp_retries2 = 8 + net.ipv4.tcp_syn_retries = 4, 要么自己作ping/pong
This post is licensed under CC BY 4.0 by the author.