@synchronized()

考えてみた

Pantherから使えるObj-Cの構文@synchronized()。スレッドの同期に使う。今までマルチスレッドに馴染みが無かったので正直自信が無いけど、えーと複数のスレッドが実行してしまうとヤバい部分をこれで囲ってブロックにすると。そのとき引き数にミューテックスというのを指定して、同じミューテックスを指定された@synchronized()ブロックは一度に一つのスレッドしか実行出来ないようになる。よし。
でもこれ使うと、このブロックに入るときはミューテックスをチェックする操作が余計に入るわけだから、シングルスレッドのときは少し遅くなるのだろうか?測ってみた。

	NSDate *start2 = [NSDate date];
	for(i=0; i<=100000; i++) {
		NSString *key = [NSString stringWithFormat:@"key%d", i/2];
		NSString *value = [NSString stringWithFormat:@"value%d", i];
		@synchronized(dic1) {
			if (![dic1 objectForKey:key]) {
				[dic1 setObject:value forKey:key];
			}
		}
	}
	NSDate *end2 = [NSDate date];

厳密な速度計測にNSDateはよくないだろうけど、まあ100000回も繰り返せばいいよね。課題はNSMutableDictionaryの操作。Thousandで多分クリティカルセクションになるような操作。本来はもちろんループごと@synchronized()ブロックに入れるべきだろうな。

測ってみた

@synchronizedなし: 0.517278 秒
@synchronizedあり: 0.581061 秒
約12%ほど@synchronizedありのほうが遅いみたい。でも残りの100%は2回のNSMutableDictionary操作ってわけだから…うー、この場合はあまり気にしなくていいってことかな。高速化したいんならもっと他にやることがありそうだ。