2007-05-01から1ヶ月間の記事一覧

COM登録時に暗号プロバイダの初期化を行う

そのため、ActiveXでは、普通に考えると、この処理をするためには整合性レベルを通常の整合性レベルまで引き上げる必要がありますが、ただそれだけのために整合性レベルを引き上げるのはちょっと如何な物かと考えられます。 そこで、別の方法を考えることに…

ERROR_PATH_NOT_FOUND

しかしながら、Vista上のIE7では、暗号プロバイダのキーセットが未初期化の場合、一回目のCryptAcquireContextがERROR_PATH_NOT_FOUND(3)という別のエラーで失敗します。Windows Vista上のIE7は、いわゆる低い整合性レベルで動作しているため、暗号プロバイ…

Windows Vista上のIE7でのCrypt API利用

Crypt APIを使うためには、通常、CryptAcquireContextを使用して、暗号プロバイダのハンドルを取得しなければなりません。この時には、KB238187 CryptAcquireContext() use and troubleshootingにあるように、暗号プロバイダのキーセットが未初期化であった…

VC8とVC7の比較

気になるのが、VC7.1ではぶっちぎりに速い組み込み関数版が、VC8ではなぜそんなに遅いのか。コードを比較してみる。 ; process<1> (VC8) fld DWORD PTR _f$[ebp] fmul ST(0), ST(0) fstp DWORD PTR _f$[ebp] movss xmm0, DWORD PTR _f$[ebp] cvttss2si ecx, …

ベンチマーク

次の様なコードを書いてベンチマークを取りました。 #include <stdio.h> #include <stdlib.h> #include <xmmintrin.h> #include <windows.h> template<int N> int f2i(float f) { return (int)f; } template<> int f2i<1>(float f) { return _mm_cvttss_si32(_mm_load_ss(&f)); } template<> int f2i<2>(float f</int></windows.h></xmmintrin.h></stdlib.h></stdio.h>…

cvttss2si

仕方がないので、アセンブラにご登場いただくことに。 int f2i(float f) { _asm {cvttss2si eax, f} } int main(int argc, char* argv[]) { float f = atof(argv[1]); return f2i(f); } そうすると、意外にもコンパクトなコードが生成されました。 mov eax, …

_mm_cvttss_si32

かといって、過度に_asmしちゃうと、他の部分の最適化を妨害するわけで、それはやりたくない。と思って、いろいろ眺めていると、xmmintrin.hの組み込み関数の中に、_mm_cvttss_si32という奴がいることに気づいた。こいつは、SSEのcvttss2siの組み込み関数版…

float -> int キャスト

Visual C++では一般的に、 int main(int argc, char* argv[]) { float f = atof(argv[1]); return (int)f; } といった類の命令は遅いとされているが、実は、VC8では、この処理が高速化されたらしい。 ということで、VC8で、/Oxでビルドしてみた結果のコード…

Vista Homeの仮想化

Windows Vistaの仮想化――ライセンス契約での扱いは?によると、MSDNだと、Vista Homeすら仮想化して良いらしい。 これで、思う存分、Vista Home上での動作検証が出来る。