スキップしてメイン コンテンツに移動

[javascript][Google App Engine]HTML5のsessionStorageで高速化

はじめて書いたjavascriptを先輩に見せたところ、取得ボタンを連打されてGoogle App Engineに対するリクエストが大変なことになりましたw

ということで、今回はその連打対策を講じてみました。

■変更点
・「取得」ボタンをクリックしたときにGetData()を呼び出すように
・sessionStorageにデータが存在するかチェックしてあれば表示
・なければAjaxでリクエストして結果をsessionStorageに保存したうえで表示

WebStorageのうちセッション単位でデータを保持するsessionStorageと永続的に保持するlocalStorageがあるが、毎日取得するデータが変わるのでsessionStorageを採用した。

同一セッションの同一パラメータ(証券コードと営業日数)の組み合わせの場合にはsessionStorageから取得している。

AjaxHistoricalPrices
http://test-004.appspot.com/html/index.html

「処理時間」には、「取得」ボタンが押されてから表示までの時間をミリ秒単位で表示している。

実際に同一パラメータで「取得」ボタンを2回以上クリックしてもらうと、かなり高速化できていることがわかると思う。

また、画面の「データ取得元」にsessionStorageから取っているか、HTTPで取っているかを表示している。

var startTime = new Date();
var endTime = new Date();
var GetData = function(){
    startTime = new Date();
    var key = document.form.ticker.value + ':' + document.form.days.value;
    var out = sessionStorage.getItem( key );
    if (!out){
        out = Request(key);
        document.getElementById("source").innerHTML = 'HTTP.';
    }else{
        document.getElementById("source").innerHTML = 'sessionStorage.';
        echo(out);
    }
}
var Request = function( key ) {
    var url = 'http://test-004.appspot.com/dlhistorical?ticker='+document.form.ticker.value+'&days='+document.form.days.value+'&type=json';
    var XHR;
    XHR = new XMLHttpRequest();
    XHR.onreadystatechange = function(){
        if( XHR.readyState === 4 && XHR.status == 200 ) 
            var data = JSON.parse(XHR.responseText);
            var out = '';
            for (i in data.Historical){
                out += '';
                for (j in data.Historical[i]){
                    out += '';
                }
                out += '';
            }
            out += '
'+data.Historical[i][j]+'
'; sessionStorage.setItem(key,out); echo(out); }; XHR.open( 'GET', url, true ); XHR.send(); } var echo = function( text ) { endTime = new Date(); var msec = endTime - startTime; document.getElementById("exectime").innerHTML = msec+"ミリ秒かかりました "; document.getElementById("result_div").innerHTML = text; }

コメント

このブログの人気の投稿

[Python]redis-pyでRedis Pub/Sub実装

前から面白そうと思っていたRedisのPub/Sub機能。 redis-pyでどう実装すれば使えるか確認してみた。 ■Pub/Subについて http://ja.wikipedia.org/wiki/出版-購読型モデル ■pub.py from redis import StrictRedis def publish(channel,msg): """ redis-pyにはPUBLISHするためのメソッドがないので、 Redisのコマンドをそのまま実行する為のクラスを使う。 """ sr=StrictRedis() """ 第1引数にRedisのコマンド、第2引数以降は そのコマンドの引数をそのままセット """ sr.execute_command("PUBLISH",channel,msg) if __name__=="__main__": # チャネル"hoge"に"Hello"というメッセージを出版(Publish) publish("hoge","Hello") ■sub.py from redis import Redis def listen(channel): r=Redis() ps=r.pubsub() ps.subscribe(channel) while True: for i in ps.listen(): print i["data"] if __name__=="__main__": # チャネル"hoge"を購読(Subscribe) listen("hoge") ■実行方法・実行結果 (ターミナル1-準備) [user@localhost ~]# python sub.py 1 # => チャネ

[OS]VirtualBoxでCentOS6.5(x86_64)がKernel panicを起こした

完全に対処療法。 恥ずかしながら自分では原因がわかっていない。 忘れないようにメモしておく。 いろいろ設定したあと、何度目かの再起動のタイミングでKernel panicが発生して起動しないという事象が発生。 こちらの方法でなんとか起動させて。 [CentOS] SELinux 無効化後のカーネルパニック http://kuni255.blogspot.jp/2013/04/centos-selinux.html こちらの通り、/boot/grub/grub.confに設定を追加。 Kernel panic – not syncing: Attempted to kill init! http://h2np.net/mynotebook/post/130 設定変更後、以下の操作をそれぞれ10回ほど試した限りでは再発していません。  (1)halt+起動 (2)reboot 追記:と思ったらまた発生した。なんかもう解決できる気がしない。

[Haskell]Database.HDBC.Sqlite3でSQLite3のデータを読む。

関数型言語のHaskellというものに手を出してみました。 今回は、システムトレードで使っているSQLite3からHaskellで時系列データ(日足)を読んでみます。 備忘録として、コードを上げておきます。 import Database.HDBC import Database.HDBC.Sqlite3 main = do conn <- connectSqlite3 "investment.dbf" closes <- getHistoricalPrices conn "2712" "CLOSE" print [zenjitsuhi |(x,y) <- (zip (init closes) (tail closes)),let zenjitsuhi = ((x-y)/y)*100] hist <- getHistoricals conn "8411" print hist disconnect conn return () getHistoricals :: IConnection c => c -> String -> IO [(String, String, String, Double, Double, Double, Double, Double)] getHistoricals conn code = do stmt <- prepare conn "SELECT S.DATE,S.CODE,S.MARKET,S.OPEN,S.HIGH,S.LOW,S.CLOSE,S.VOLUME FROM STOCK_DAILY S,MARKET_LISTINGS L WHERE L.CODE=? AND L.MAIN_MARKET='true' AND L.CODE=S.CODE ORDER BY S.DATE DESC" execute stmt [(toSql code)] rows <- fetchAllRows s