未分類

linuxだとdiff -uprNでパッチを作成して、patch -p1 <パッチファイル みたいなことをしてパッチを当てますが、この方法linuxでしか使えません。これをパッチ当てる部分だけpythonで使えるようにしたい、というのがこの記事の主旨です。

pypi(pip)でパッケージ探せばいいのかなぁと思ってたのですが、古かったり機能が足りなかったり、テスト用のmockのためのコードだったり、欲しいものとやや違ってて、当初は自作するしかという状況でした。しかし、最近 whatthepatch というパッケージを見つけ、自作をやめて使用例を記事にすることにしました。

未分類

C/C++のmemcpyは十分に最適化されており、forループする大抵のコードよりは速くなるように出来ています。しかし測り方を間違えると十分な効果を期待できません。例えばLinuxで以下のコードでは正しく測定できません。なぜだか分かりますか?

#include <chrono>
#include <iostream>
#include <cstring>

using namespace std;
using namespace std::chrono;

typedef size_t target_t;

int main(int argc, char* argv[]) {
    constexpr size_t N = 1024 * 1024 * 1024; // 1GiB

    auto src = new target_t[N/sizeof(target_t)];
    auto dst = new target_t[N/sizeof(target_t)];

    auto begin = high_resolution_clock::now();
    memcpy(dst, src, N);
    auto end = high_resolution_clock::now();

    cout << N << "bytes copy: " << N / 1024. / 1024. / duration_cast<nanoseconds>(end - begin).count() * 1000000000 << "[MiB/s]" << endl;
    return 0;
}

プログラムは正しく動きます。

$ g++ -g -O0 hoge.cpp -o hoge
$ ./hoge
1073741824bytes copy: 1560.47[MiB/s]
$

何が正しく測定できてないのでしょう?