ホーム 主筆 その他ソフト その他情報 Syuhitu.org English

Windows関連

スクリーンセーバー作成法

半透明ウインドウの性能

bootfont.bin

キャビネット形式

ウインドウスタイルをいじる

Java製ソフトをServiceに登録する

イベントログにメッセージを出力する

コントロールパネルにアイコンを追加する

スクリプトによる拡張1

スクリプトによる拡張2

ガジェットの作成

大容量メモリ

メモリ搭載量の下限に挑む

スパースファイルにする

表示されるアイコンの種類を調べてみた

メモリマップIOとエラー処理

ファイルを作る順番と速度の関係

Cryptography API: Next Generationを使う

Windows 10のアクセントカラー

iSCSIディスクにバックアップを取る

サーバプロセスを分離して実装する

サーバプロセスを分離して実装する - F#

レジストリに大量に書き込む

Solaris関連

OpenGL

Solaris設定

ディレクトリの読み込み

主筆プラグイン開発

マルチスレッドでの開発

door

音を出す

Blade100の正しい虐め方

パッケージの作成

画像入出力

BMPファイル

ICOファイル

ANIファイル

JPEGファイル

減色アルゴリズム

減色アルゴリズムの並列化

その他アルゴリズムなど

自由軸回転

Base64

文字列操作

CPU利用率の取得

正規表現ライブラリ

メタボールを作る

メタボールを作る2

正規表現とNFA・DFA

C言語の構文解析

液晶ディスプレイを解体してみた

iSCSIの理論と実装

単一フォルダにファイルを沢山作る

USB-HUBのカスケード接続

SafeIntの性能

VHDファイルのフォーマット

USBメモリに書き込み続けてみた

SafeIntの性能

2016年1月24日公開

SafeIntライブラリ

整数オーバーフロー攻撃に対応するため、整数演算を行う際にいちいち上限や下限をチェックしてやるというライブラリがある。Visual C++だとSafeIntというのを使うことができる。

SafeIntの詳細な説明は以下に記載されている。

https://msdn.microsoft.com/ja-jp/library/dd570023.aspx

整数オーバーフロー攻撃については、以下のページを見た方が早い。

https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/c907.html

しかし、リンクだけ張って何も書かないとこのページの存在意義がなくなるから、ごく簡単に使用例だけ示す。

SafeInt<int> i, j, k;
  for ( i = 0; i < 10; i++ ) {
    j = i * 2;
    k = i * 3;
    printf( "%d, %d, %d\n", (int)i, (int)j, (int)k );
  }

基本的にintと書くべきところをSafeInt<int>に置き換えてやれば、後は自動的にオーバーフローとか未定義の演算をチェックしてくれるようになるらしい。

もっとも、C++のクラスとして定義されている以上、必ずしも100%の互換性があるわけではない。だがそれはC++の言語仕様の問題だから、ここではあまり議論しない。

SafeIntの性能

さて、ここで気になるのは性能である。

セキュリティ上の理由から整数演算を行う都度オーバーフローしていないかなどをチェックしなければならないのだから、当然SafeIntでもそういうことを行っているわけで、ということは、それ相当のオーバーヘッドが生じるのではないかと気になってくる。

ということで、試してみた。

ベンチマークプログラム

上記のように適当なものを作って実行しても、あまり面白みがないと思われる。なので、何か著名なベンチマークを使おうと思ってDHRYSTONEをいじってみることにしてみた。

無論、SafeIntを使わなければならない以上、K&RのCで書かれた元のソースをそのままC言語でコンパイルすることはできない。C++でコンパイルが通るように修正したのがこのファイル。

not_safe_int.zip

Visual Studio 2010でコンパイルして、一応実行できるようにしてみた。

SafeIntなしの場合の性能

結果だけ書く。

分類回次Dhrystones per Secondの値
デバッグ1回目2,808,042.3
2回目2,811,199.8
3回目2,809,857.0
リリース1回目29,103,608.0
2回目29,154,518.0
3回目28,710,882.0

1秒で3千万回弱というのが早いのか遅いのか、いまいちよくわからない。だが、他のマシンと競っているのではないのでこれはこれでいいものとする。

SafeIntありの場合の性能

次に、プログラム中で使用されているintを極力SafeInt<int>に置き換えたバージョンを用意した。

safe_int.zip

同じく、結果だけ書く。

分類回次Dhrystones per Secondの値
デバッグ1回目159,502.6
2回目159,518.6
3回目159,380.1
リリース1回目 14,797,277.0
2回目14,981,273.0
3回目14,981,273.0

デバッグ版どうしで比較すると実行時間が17.6倍、リリース版どうしで比較すると実行時間が1.94倍に伸びている。

雑感

検索すると、性能低下の度合いは数%程度などと言われているようだが、それは嘘だろう。

どこに使うのかが重要で、全部を一律SafeIntに置き換える奴が悪いというのかもしれないが、しかし、それは単に「使わなければ早くなる」と言っているのに等しく意味のない議論だ。とりあえず、遅くなるものは遅くなるということで。


連絡先 - サイトマップ - 更新履歴
Copyright (C)  2000 - 2016 nabiki_t All Rights Reserved.