投稿

11月, 2020の投稿を表示しています

Type 3 フォントが埋め込まれた古い PostScript データになっている論文をそこそこ綺麗な PDF にする

これを使う。 CTAN: Package pkfix 以下利用例(論文ではないけれど) $ pkfix-helper Lions\ -\ 1977\ -\ Lions\'\ Commentary\ on\ UNIX®\ 6th\ Edition.ps lions-helper.ps Reading Lions - 1977 - Lions' Commentary on UNIX® 6th Edition.ps ... done. Total number of Type 3 fonts encountered: 16 Bitmapped fonts are typeset at 300 DPI. Finding character widths ... done. Reading TFM files ... done (103 TFMs in 193 scaling variations). Matching fonts: Processing Fn ... done (cmsl10 @ 1X, mismatch=0.53898). Processing Ff ... done (cmtt10 @ 1X, mismatch=0.19819). Processing Fg ... done (cmbx12 @ 1X, mismatch=0.36583). Processing Fi ... done (cmbx10 @ 1X, mismatch=0.42627). Processing Fk ... done (cmti10 @ 1X, mismatch=0.20169). Processing Fj ... done (cmbx12 @ 1.2X, mismatch=3.41283). pkfix-helper: Best match for Fj is rather poor Processing Fe ... done (cmssi10 @ 1X, mismatch=0.37342). Processing Fo ... done (cmr17 @ 1X, mismatch=0.12955). Processing Fb ... done (cmsl10 @ 1.2X,

時刻取得・時間計測

IA-32、AMD64、Intel 64 のいずれかのアーキテクチャで TSC (Time Stamp Counter) を用いる例。 #include <stdio.h> #include <stdlib.h> #include <stdint.h> static inline uint64_t rdtscp(void) { uint64_t rax, rdx, aux; __asm__ volatile ("rdtscp\n" : "=a" (rax), "=d" (rdx), "=c" (aux) : : ); return (rdx << 32) + rax; } int cmp(const void *a, const void *b) { return *(int*)a - *(int*)b; } int main(int argc, char **argv) { int array[] = { 5, 10, 111, 3, 16, 28, 591, 360, 1, 0, 83, 72, 71, 33, 55 }; uint64_t start_time, end_time; start_time = rdtscp(); qsort(array, sizeof(array)/sizeof(int), sizeof(int), cmp); end_time = rdtscp(); printf("start TSC: %PRI64u\nend TSC: %PRI64u\nend - start: %PRI64u\n", start_time, end_time, end_time - start_time); return EXIT_SUCCESS; } 元々は rdtsc が用いられていたが、Out-of-Order 実行を実装した P6 マイクロアーキテクチャ (Pentium Pro) 以降では命令実行順が保証されないため rdtsc の前に

コードカヴァレッジ計測

イメージ
コードカヴァレッジとは あるプログラムコードについて実行した際に、実際にコード中の命令を何割実行したかを数値に表したものを言う。 計測手法 方法は様々である。たとえば、Linux kernel の fuzzer である Google の syzkaller を用いれば、ユーザーアプリケーションへの入力を自動で変化させつつコードカヴァレッジを確認させてくれる。また、Linux kernel のコンフィグ自体にもカヴァレッジについてのコンフィグが存在する。これは masami256 さんのブログなどが詳しい 。 今回は gcc に組込みの手法でカヴァレッジテストを実行する手法についてメモをする gcov gcov がカヴァレッジ情報を .gcov という拡張子でダンプすることでカヴァレッジを確認できる。このコマンドは gcc に附属している。 使い方を見ていく このようなソースコードを用意し、次のようにコンパイルする。 $ gcc -fprofile-arcs -ftest-coverage -o cov_test cov_test.c すると次のようなファイルが用意されるはずだ。 $ ls cov_test cov_test.c cov_test.gcno これでカヴァレッジテストの準備は完了した。では、実際にカヴァレッジテストを行なってみよう。まずは、何も引数を与えずコンパイルしたコードを実行する。 $ ./cov_test ./cov_test: you need to pass arguments at least 1 $ ls cov_test cov_test.c cov_test.gcda cov_test.gcno .gcno に加えて .gcda が追加されている。このファイルがカヴァレッジテストの結果を格納している。ここで、 gcov コマンドを用いてみよう。 $ gcov cov_test.gcda File 'cov_test.c' Lines executed:38.89% of 18 Creating 'cov_test.c.gcov' cov_test.c というコード全体が 18 行で、そのうち 38.89% が実行されたということを物語っている。また、