Both approaches have no big differences on performance from my testing. An asynchronous page serves one page while an asynchronous PreRequestHandler execution serves all the pages. So an asynchronous PreRequestHandler execution normally has to filter pages. An asynchronous page might serve as the base class for a set of pages or a standalone page. Asynchronous pages have slightly advantages over asynchronous PreRequestHandler execution in this aspect.
As we noted before, the end point of the asynchronous page approach is after the Page_Load event (actually after the ProcessRequest call). This may cause problem if we try to do page redirects during the ProcessRequest process. Actually Server.Transfer doesn’t work though Response.Redirect works. This is a big drawback.