こんにちは、Sleipnir 開発担当の西田です。
先日 Sleipnir 3 RC 版をリリースしましたが、その後も特に高速化に力を入れて改良を続けてきました。高速化には測定が欠かせませんので、各種ツールを活用して様々な測定を行った上で、プログラムを修正しています。
そこで今回は起動時間を測定するために作成した Ruby スクリプト、startup.rb を紹介したいと思います!
startup.rb は、下図のような流れで起動時間を測定しています:
ブラウザを起動してからページの読み込みが完了するまでの時間を計測しています。ユーザーが感じる起動時間と正確に一致するものではないと思いますが、1つの指標として利用できます。
startup.rb のソースコードは次の通りです:
require 'Win32API' require 'webrick' FIND_WINDOW = Win32API.new('user32', 'FindWindow', %w(p p), 'l') SEND_NOTIFY_MESSAGE = Win32API.new('user32', 'SendNotifyMessage', %w(l i i i), 'l') WM_CLOSE = 0x0010 WM_QUIT = 0x0012 WM_SYSCOMMAND = 0x0112 SC_CLOSE = 0xF060 INTERVALS = [5] * 4 # 測定するブラウザのブラウザ名、実行パス、ウィンドウクラス名、ウィンドウのキャプション BROWSER_DATA = [ ['Sleipnir297' , '"D:\temp\sleipnir\sleipnir297\bin\Sleipnir.exe"', 'SleipnirMainWindow', nil], ['Sleipnir3RC1', '"D:\temp\sleipnir\sleipnir3rc1\bin\Sleipnir.exe"', 'MainWindow', 'Sleipnir'], ['Sleipnir3RC5', '"D:\temp\sleipnir\sleipnir3rc5\bin\Sleipnir.exe"', 'MainWindow', 'Sleipnir'], ] #現在時刻の整数(ms)を得る def get_current_millsec now = Time.now ms = now.hour ms = ms * 60 + now.min ms = ms * 60 + now.sec ms = ms * 1000 + now.usec / 1000 ms end # 閉じるボタンを押す def send_close_to_matching_window(classname, caption) # 2回送る 2.times do hwnd = FIND_WINDOW.call(classname, caption) SEND_NOTIFY_MESSAGE.call(hwnd, WM_SYSCOMMAND, SC_CLOSE, 0) end end que = Queue.new #HTTPサーバー開始 srv = WEBrick::HTTPServer.new({ :DocumentRoot =>gt; './', :BindAddress => '127.0.0.1', :Port => 8080}) srv.mount('/', WEBrick::HTTPServlet::FileHandler, 'index.html') srv.mount_proc('/onload') do |req, res| ms = req.query['ms'].to_i que.push ms res.body = ms.to_s end trap(:INT){ srv.shutdown } thread_srv = Thread.new do srv.start end #ブラウザの起動時間測定開始 BROWSER_DATA.each do |name, path, classname, caption| print "#{name}: #{path}\n " elapses = INTERVALS.map do |e| sleep e ms_before = get_current_millsec spawn path ms = que.pop - ms_before print "#{ms}," sleep e send_close_to_matching_window(classname, caption) ms end puts "\n average: #{elapses.inject(:+) / elapses.size}\n" end
ブラウザで読み込ませる index.html は次のとおりです:
<!-- saved from url=(0014)about:internet --> <html> <head> <title> </head> <body> <script type="text/javascript" language="javascript"> window.onload = function() { dt = new Date(); ms = dt.getHours(); ms = ms * 60 + dt.getMinutes(); ms = ms * 60 + dt.getSeconds(); ms = ms * 1000 + dt.getMilliseconds(); try { var http = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) { var http = new XMLHttpRequest(); } http.onreadystatechange = function() { if (http.readyState == 4 && http.status == 200) { document.body.innerHTML = "ok: " + http.responseText } } http.open("GET", "onload?ms=" + ms); http.send(null); } </script> loading... </body> </html>
WEBrick を使うと、とても簡単に HTTP サーバーを実装することができます。実際、サーバーに関するコードはたったの 11 行です!
また Ruby は Windows 環境のためのライブラリも用意されており、 FindWindow や SendNotifyMessage といった Windows API も呼び出すことができるので、*nix 環境だけでなく Windows 環境でも幅広く活用することができます。
では、startup.rb の使用方法を説明します。まず計測したいブラウザで起動直後に http://localhost:8080/ が読み込まれるようにします。次に上記の startup.rb と index.html を同じフォルダに置き、startup.rb の BROWSER_DATA に計測したいブラウザの情報を設定します。そして startup.rb を Ruby インタプリタで実行し、測定を開始します。
startup.rb を使って測定した Sleipnir の起動時間は次の通りです:
タブ1個で起動 | タブ20個復元して起動 | |
Sleipnir 2.9.7 | 1137[ms] | 1792[ms] |
Sleipnir 3 RC | 830[ms] | 1249[ms] |
Sleipnir 3 RC 最新テスト版 | 681[ms] | 691[ms] |
Sleipnir 3 RC 最新テスト版の起動時間が最も早く、復元するタブが増えても起動時間にほとんど影響しないところが特徴的ですね!
それでは、これからも フェンリル / Sleipnir をよろしくお願いします。