>>819
その本でどのように説明されているのか私は知りませんので、
的外れなレスでしたらごめんなさい。

bracket と bracketOnError はそもそも役割が異なり、
その処理効率によって比較するものではありません。

bracket は第3引数のIOアクションの実行時に例外が発生しようがしまいが、
第2引数のIOアクションは実行されます。

一方、bracketOnError は第3引数のIOアクション実行時に例外が発生した場合のみ、
第2引数のIOアクションが実行されます。
(どちらの説明もライブラリドキュメントに書かれています)

なので、確保したリソースの第3引数のIOアクション後の解放を保証したいのならば、
bracketOnError は使えません。
例外が発生しなければ第2引数のIOアクションは実行されないので。


ちなみに、この2つの関数、中身はほとんど同じです。
http://hackage.haskell.org/package/base-4.8.1.0/docs/Control-Exception.html
ここの各関数のシグネチャの右端にソースへのリンク(Sourse)があるので、見てみてください。
どうでしょう、効率に差があるように見えるでしょうか。