Hatena::Grouporera

もし高校野球の女子マネージャーがOpera Browserを使ったら

logo
 | 

2009-05-15

Cookieを使うようにしたらoAutoPagerizeが速くなるんじゃないかと思ったけど、そんなに速くならなかったので埋葬

06:58

SITEINFO の中で、AutoPagerize を実行できるものの順番を Cookie に保存しておけば、次からは速くなるんじゃないかと思った。

こんな感じで。

APSI=31|156|679

AutoPagerize の SITEINFO で、このページで使える可能性のあるものは 31 番目と 156 番目と 679 番目ですよ、ということ。(1つのサイトでも別のタイプの SITEINFO を使わないといけないときもあるので)


oAutoPagerize で、こうなってる部分を、

list.some(function(info) {
	try {
		var exp = new RegExp(info.url);
		if (ap) {
		} else if ( ! exp.test(locationHref) ) {
		} else if (!getFirstElementByXPath(info.nextLink)) {
			// ignore microformats case.
			if (!exp.test('http://a')) {
				debug('nextLink not found.', info);
			}
		} else if (!getFirstElementByXPath(info.pageElement)) {
			if (!exp.test('http://a')) {
				debug('pageElement not found.', info);
			}
		} else {
			ap = new AutoPager(info);
			contentWindow.AutoPagerize.AutoPagerObject = ap;
			return true;
		}
	} catch(e) {
		log('error at launchAutoPager() : ' + e);
	}
});

こんな感じで。

function verifyInfo(info) {
	try {
		var exp = new RegExp(info.url);
		if (ap) {
		} else if ( ! exp.test(locationHref) ) {
		} else if (!getFirstElementByXPath(info.nextLink)) {
			// ignore microformats case.
			if (!exp.test('http://a')) {
				debug('nextLink not found.', info);
			}
		} else if (!getFirstElementByXPath(info.pageElement)) {
			if (!exp.test('http://a')) {
				debug('pageElement not found.', info);
			}
		} else {
			ap = new AutoPager(info);
			contentWindow.AutoPagerize.AutoPagerObject = ap;
			return true;
		}
	} catch(e) {
		log('error at launchAutoPager() : ' + e);
	}
}
if (window.navigator.cookieEnabled) {
	indices = [];
	document.cookie.split('; ').some(function(cookie){
		if (cookie.indexOf('APSI') === 0) {
			indices = cookie.split('=')[1].split('|');
			return true;
		}
	})
	for (var n = indices.length; n--;) {
		if ( verifyInfo(list[indices[n]]) ) {
			log('Cookie found');
			break;
		}
	}
}

if (!ap) {
	for (var n = list.length; n--;) {
		if ( verifyInfo(list[n]) ) break;
	}
	if(n >= 0 && window.navigator.cookieEnabled) {
		var expir = new Date(new Date().getTime() + 7*24*60*60*1000).toGMTString();
		var cookieExist = document.cookie.split('; ').some(function(cookie){
			if (cookie.indexOf('APSI') === 0) {
				var indices = cookie.split('=')[1].split('|').concat([n]);
				document.cookie = 'APSI=' + indices.join('|') + '; expires=' + expir;
				return true;
			}
		})
		if (!cookieExist) {
			document.cookie = 'APSI=' + n + '; expires=' + expir;
		}
		log('Stored in Cookie');
	}
}

うーん、速くなるかと思ったけどそんなに速くならなかった。速くなるところでは3分の2ぐらいになるんだけど、ほとんどのサイトでは同じぐらい。

AutoPagerize の起動にかかる時間って大体 100ms ぐらいなので、別に気にすることじゃないんですけどね。

あと、ちょっと前のバージョンから正規表現を全部コンパイルするわけではなくなったので、そこまで効率が悪いわけではない。

まあ1500やそこらの SITEINFO をスキャンするぐらいでごちゃごちゃ言うなってことですね。


パッチも埋葬。

% diff -p oAutoPagerize.js oAutoPagerize_cookie_enabled.js             
*** oAutoPagerize.js	2009-05-14 17:07:32.000000000 -0400
--- oAutoPagerize_cookie_enabled.js	2009-05-14 17:38:19.000000000 -0400
***************
*** 615,621 ****
  		var launchAutoPager = function(list) {
  			log('launchAutoPager(...)');
  			var s = (new Date).getTime();
! 			list.some(function(info) {
  				try {
  					var exp = new RegExp(info.url);
  					if (ap) {
--- 615,622 ----
  		var launchAutoPager = function(list) {
  			log('launchAutoPager(...)');
  			var s = (new Date).getTime();
! 
! 			function verifyInfo(info) {
  				try {
  					var exp = new RegExp(info.url);
  					if (ap) {
***************
*** 637,643 ****
  				} catch(e) {
  					log('error at launchAutoPager() : ' + e);
  				}
! 			});
  			log('launchAutoPager... fin:'+((new Date).getTime()-s));
  			MICROFORMATs.forEach(function(format){
  				if (!ap && getFirstElementByXPath(format.nextLink) && getFirstElementByXPath(format.pageElement)) {
--- 638,679 ----
  				} catch(e) {
  					log('error at launchAutoPager() : ' + e);
  				}
! 			}
! 			if (window.navigator.cookieEnabled) {
! 				indices = [];
! 				document.cookie.split('; ').some(function(cookie){
! 					if (cookie.indexOf('APSI') === 0) {
! 						indices = cookie.split('=')[1].split('|');
! 						return true;
! 					}
! 				})
! 				for (var n = indices.length; n--;) {
! 					if ( verifyInfo(list[indices[n]]) ) {
! 						log('Cookie found');
! 						break;
! 					}
! 				}
! 			}
! 			if (!ap) {
! 				for (var n = list.length; n--;) {
! 					if ( verifyInfo(list[n]) ) break;
! 				}
! 				if(n >= 0 && window.navigator.cookieEnabled) {
! 					var expir = new Date(new Date().getTime() + 7*24*60*60*1000).toGMTString();
! 					var cookieExist = document.cookie.split('; ').some(function(cookie){
! 						if (cookie.indexOf('APSI') === 0) {
! 						var indices = cookie.split('=')[1].split('|').concat([n]);
! 						document.cookie = 'APSI=' + indices.join('|') + '; expires=' + expir;
! 						return true;
! 					}
! 				})
! 				if (!cookieExist) {
! 					document.cookie = 'APSI=' + n + '; expires=' + expir;
! 				}
! 				log('Stored in Cookie');
! 				}
! 			}
! 
  			log('launchAutoPager... fin:'+((new Date).getTime()-s));
  			MICROFORMATs.forEach(function(format){
  				if (!ap && getFirstElementByXPath(format.nextLink) && getFirstElementByXPath(format.pageElement)) {
トラックバック - http://orera.g.hatena.ne.jp/edvakf/20090515
 |