意外に遅くない!? CriticalSection

VC++ CriticalSectionの速度をみると、ループ速度が14倍遅くなる!?
というのを見かけたので、これから実装してみる処理を見立ててサンプリングしてみることにしました。

やりたいことは単純で、1つのメッセージキューがあり、そのキューは複数のスレッドがアクセスします。
ロックして行う作業はメッセージを入れるか、取り出すかの単純なものです。

というわけで、以下のようなコードを書いてみました。

#include <stdio.h>
#include <tchar.h>
#include <list>
#include <iostream>
#include <windows.h>

std::list<int>    listValues;

CRITICAL_SECTION  lock;

__int64           intCounterFreq;

void push(void)
{
  listValues.push_back(0);
}

int pop(void)
{
  const int value = listValues.front();
  listValues.pop_front();
  return value;
}

void nolock(void)
{
  __int64  intStartCounter;
  __int64  intEndCounter;

  ::QueryPerformanceCounter(reinterpret_cast<LARGE_INTEGER *>(&intStartCounter));
  std::cout << "start no locking mode at " << intStartCounter << "." << std::endl;

  for (int i = 0; i < 100000; i++)
  {
    push();
    pop();
  }

  ::QueryPerformanceCounter(reinterpret_cast<LARGE_INTEGER *>(&intEndCounter));
  std::cout << "end no locking mode at " << intEndCounter << " offset " << (intEndCounter - intStartCounter) << "." << std::endl;
}

void sectionLock(void)
{
  __int64  intStartCounter;
  __int64  intEndCounter;

  ::QueryPerformanceCounter(reinterpret_cast<LARGE_INTEGER *>(&intStartCounter));
  std::cout << "start section locking mode at " << intStartCounter << "." << std::endl;

  for (int i = 0; i < 100000; i++)
  {
    ::EnterCriticalSection(&lock);
    push();
    ::LeaveCriticalSection(&lock);

    ::EnterCriticalSection(&lock);
    pop();
    ::LeaveCriticalSection(&lock);
  }

  ::QueryPerformanceCounter(reinterpret_cast<LARGE_INTEGER *>(&intEndCounter));
  std::cout << "end section locking mode at " << intEndCounter << " offset " << (intEndCounter - intStartCounter) << "." << std::endl;
}

int _tmain(int argc, _TCHAR * argv[])
{

  ::InitializeCriticalSection(&lock);

  ::SetThreadAffinityMask(::GetCurrentThread(), 0x1);
  ::QueryPerformanceFrequency(reinterpret_cast<LARGE_INTEGER *>(&intCounterFreq));

  // test functions
  nolock();
  sectionLock();

  ::DeleteCriticalSection(&lock);
  return 0;
}

これを以下の環境で測定!

Model : HP Mini 2140
OS : Windows 7 Enterprise 32bit
CPU : Atom N270 1.6GHz
MEM : 2GB

環境は…Visual Studio 2010 RC(笑
コンパイラの最適化は有りで、Visual C++のデフォルト最適化のままです。
というのも、実際には最適化なしでソフトウェアをリリースするなんてことはありえませんし…。

結果は…
ロックなしが65873サンプル、ロック有りが91059サンプル(38%増加)
これを6回測定し、平均が21%遅くなるというものでした。

…と実際に処理を交えてみると、気になるほど極端には遅くならないようにみえます。
ロック処理中に何をするのか、にもよってきますので、
排他制御を適用される際には、疑似ロジックを用意して測定してみた方がよろしいようです。

コメントなし

コメントを残す

Xbox 360、2台目購入!

えー、Xbox 360 2台目を買ってみました。
というわけで、Xbox 360 初期型と比較してみたいと思います!

Xbox 360 Arcade到着ー!

開けてみると、格納のされ方が初期ロットの時とあまり変わってないようです。

これこれ、『ようこそ』だらけのビニール袋。→WACOM intuos4到着。

本体の下に付属品が配置される構造も変わらず。
ただ、本体の重さのせいで結構つぶれやすいので、やめてほしいところ…。

アーケードなので、ドライブベゼルも白です。

おや? HDDを接続する凹みがない?

こんなカバーがあるんですね。初期ロットでは存在しなかった部品です。

HDMI!
今回はHDMI欲しさに買いました…ただそれだけのために。

左が初期ロット、右が今回の本体。別に初期ロットが故障したわけでもなく、現役バリバリ。
ドライブベゼルしか違いがない…ですね、おそらく。

側面からみてもさっぱり違いがわかりませんw
左が初期ロット、右が新ロット。

背面でしか差がわかりませんw
HDMIの他に文字が横置き向け表記から、縦置き向け表記に変わってるのは何故なんでしょうね?

初期ロットは製造が2005年!もう4年以上も前なんですね-。

その4年後の新ロット。

ACアダプターを比較!小型化されてる!
あ。逆になっちゃいました。左が新ロット、右が初期ロット。

高さも微妙に低くなってます。

幅は変わらないかな…?コードの太さは細くなってますね。
上が新ロット、下が初期ロットです。

初期ロットでは、203W 12V 16.5Aが…

新ロットでは、150W 12V 12.1Aと省電力になってます。

ただ、いいことだけではなく、コスト削減の為にちゃっちになっているところも。
左が初期ロット、右が新ロット。抜くためのリリースボタンがなくなり、シールドがなくなりました…。

プラグの形状が若干変更されています。誤挿入防止用かと思われます。

ついでに並べてみた-。

すっかりすり減ったスティック…

元々はこうだったんですよ!

初期ロットはつやのある塗装だったのが…

つや消しになってる!と微妙に違うようです。

コメントなし

コメントを残す

直球ど真ん中ストライークッ!!!!!(何w

甘酸っぱさ爆裂に悶え死にそうdeath!!!!

コメントなし

コメントを残す