
見積もりも取ってもらって、あとは自分に支払い能力があるのか、
冷静に考えたいと思います!(初めてなので。)
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 初期型と比較してみたいと思います!
Xbox 360 Arcade到着ー!

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

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

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

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

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

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

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

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

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

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

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

その4年後の新ロット。

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

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

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

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

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

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

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

ついでに並べてみた-。

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

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

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

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

そして、40インチワイド液晶テレビ(LCD-40MXW300)も届いた。
うんしょっと、壁寄せ金具に取り付けてっと…完成!
これでベヨネッタをやってみる…。
なんというか、スゴイとしか言いようがないっす。
これはいいですね。
それに壁寄せ(壁掛け)にすると、全体的にスッキリした印象になってよいですね。
YRS-1000(B)を注文してしまったw
しかも、Sofmapで。ポイントだけで、今月分のゲーム代金分が賄えてしまうというwww
今週末に届くので、楽しみ♪
この3連休は久しぶりのC++をガリガリ書きまくってました。

モチベーションが高い時の効率は良いんですけどねー。
End of Eternityを予約してみた。
そういえば、Infinite Undiscoveryといい、無限とか悠久とかが好きですね…tri-Ace。
HDDから異音を発して、固まったり…
うーん、コレはやばそうだ…
データがお亡くなりになる前に、HDDを買ってきて入れ替えよう…

