排他処理のパフォーマンス

Text::Kakasi での問題を回避するため、mkdir を使って排他処理を行うようにしたのだけど、やはりあまりパフォーマンスがよくないようだ。簡単なベンチマークプログラムを作成して試してみたところ、Thread::Semaphore を使用した場合に比べて 3 割くらい遅くなってしまっていた。エラーを発生させないためとはいえ、この差は大きい。
mkdir の代わりに flock を使うのも試してみたのだけど、それでも Thread::Semaphore に比べれば遅い。また、flock には互換性の問題もあることから、mkdir を使ったままで処理を軽くする方法を考えてみた。それは、できるだけ排他処理を行う回数を減らすというものだ。
現在は、Text::Kakasi が呼ばれるたびに排他処理を行っている(簡単にわかりやすくいえば、メールの 1 行 1 行を処理するたびにロックがかかる)のだけど、これを、メール 1 通ごとに排他処理を行うようにしてみた。1 通のメールを処理している間は他のメールを受信することができなくなるが、その影響よりも、ボトルネックになってしまっていると思われる mkdir (と rmdir)を呼ぶ回数を減らした方が得ではないかということだ。変更してみたところ、目に見えて効果があらわれ、Thread::Semaphore を使った場合と比べても、メール 1 通の処理について平均で 0.01 秒くらいの速度低下に抑えることができた。これなら実用レベルかもしれない。
しかし、メール 1 通ごとにということになると、平行してメールを受信するという意味もあまりなくなってしまうかもしれない(実際には、Text::Kakasi を使う部分ではひとつひとつ処理しなければならないので同じことなのだけど)というところが気になって、他によい方法がないかを考えているところ。Thread::Semaphore が使えればなにも悩むことはないのだけど……。