タグ

ブックマーク / qiita.com/saka1_p (2)

  • 2で割ることと3で割ること - Qiita

    この記事でお題にするのはCPUレジスタ上の整数除算です。以下、単に除算とも書きます。 除算は非常に高コストな演算なため、コンパイラは最適化によって、できるだけ整数除算を別の計算に置き換えようとします。 最適化ができる場合の一つとして、割る数が定数である場合があります。頭のいいコンパイラは、除算を乗算とビットシフト等を駆使した演算に置き換えます。この記事では、そういった最適化の背景にある理屈を部分的に解説します。 計算機環境としてはモダンなx86 CPUを仮定します。したがってレジスタは32/64ビットであり、負数は2の補数表現になっています。ある程度は他の命令セットでも通用する話になっているかもしれません。 そもそも整数の除算とは プログラミングにおける整数の除算の定義について確認します。整数$n$を整数$d$で割るとき $$ n = q \times d + r $$ が成り立つように除

    2で割ることと3で割ること - Qiita
  • UTF-8のコードポイントはどうやって高速に数えるか - Qiita

    UTF-8文字列からコードポイント数を計算するアルゴリズムについて紹介します。コードポイント数カウントは、シンプルに書くのはそれほど難しくないものの、高効率な実装は意外にややこしいです。 内容は二立てです。 実践的な実装について、Ruby(CRuby)の内部実装(string.c)で使われているものを紹介します。 標準Cの範囲を超えて、SIMD命令(AVX/AVX2)を使った実装についても述べます 軽く検索する限りだと既知のアルゴリズムが見当たらなかったので、アドホックな実装をひねり出しましたが、そんなに効率は悪くなさそうです おまけで簡単な性能評価をやってみました。 なお、UTF-8文字列はバリデーション済み(不正なシーケンスでないことが分かっている)であるとします。 Rubyの内部実装だとどうやっているか まずは、それがコードポイントの先頭バイト(leading byte)かを判定す

    UTF-8のコードポイントはどうやって高速に数えるか - Qiita
  • 1