SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Curlで構築する長崎電子県庁システム(DBメンテナンスツール編)(AD)

Curlで構築する長崎電子県庁システム(DBメンテナンスツール)
データ表示パフォーマンスの向上

第2回

  • このエントリーをはてなブックマークに追加

TableとRecordGridの速度比較

 下図のように1000行を表示するプログラムを「Table」、「RecordGrid」を使ってそれぞれ作成し、速度を比較してみました。

RecordGridを使用した画面
RecordGridを使用した画面
Tableを使った場合のロジック
||StopWatchクラスで処理時間計測開始
{let v_sw:StopWatch = {StopWatch}}
{v_sw.start}

{let v_tbl:Table = {Table
                     border-width = 1pt,
                     vertical-line-width = 1pt,
                     horizontal-line-width = 1pt,
                     cell-border-color="#cccccc",
                     background="#ffffff"}}

{for x:int=1 to 1001 do
  ||1行面は見出し
  {if x == 1 then
    {v_tbl.add
      {row-prototype height=20pt,
        {cell background="#B0D0FF",
          {TextFlowBox width = 150pt, "カラム名"}
        },
        {cell background="#B0D0FF",
          {TextFlowBox width = 150pt, "データ"}
        }
      }
    }
  else
    {v_tbl.add
      {row-prototype height=20pt,
        {cell
          {TextFlowBox width = 150pt, "カラム名" & (x - 1)}
        },
        {cell 
          {TextField width = 150pt}
        }
      }
    }
  }
}

{let v_box:ScrollBox = {ScrollBox width = 330,height = 300,v_tbl}}
{value v_box}
||処理時間出力
{output "Tableを使って作成:" & {v_sw.elapsed} & "で表示完了"}
RecordGridを使った場合のロジック
||RecordGridのセルにコントロールをセットするためのclass定義----------
{define-class public open anyCell {inherits StandardRecordGridCell}

  {constructor public {default}
     {construct-super}
     set self.margin =2pt
  }

  {method public open {refresh-data}:void
    {self.clear}
    let (data:any, valid?:bool) = {self.get-data}
    {self.add-internal data}
  }
}
||RecordGridのセルにコントロールをセットするためのclass定義----------END

||StopWatchクラスで処理時間計測開始
{let v_sw:StopWatch = {StopWatch}}
{v_sw.start}

{let v_box:VBox = {VBox}}

{let v_recFieldsArray:{Array-of RecordField} = {new {Array-of RecordField}}}

||RecordGridのフィールド(列)定義
{v_recFieldsArray.append
  {RecordField "colName",caption="列名", domain = any}
}
{v_recFieldsArray.append
  {RecordField "dataField",caption="データ", domain = any}
}

||RecordGridのフィールド(列)の型定義(ここのcell-specでカスタムセルを指定してコントロールを表示する)
{let v_recGridColumnArray:{Array-of RecordGridColumn} = {new {Array-of RecordGridColumn}}}

{v_recGridColumnArray.append
  {RecordGridColumn "colName", sort-spec=null,cell-spec=anyCell,width=150pt}
}
{v_recGridColumnArray.append
  {RecordGridColumn "dataField", sort-spec=null,cell-spec=anyCell,width=150pt}
}

||RecordFieldをもとにRecordSetを作成
{let v_recSet:RecordSet = {RecordSet {RecordFields {splice v_recFieldsArray}}}}

||RecordSetに1000件のデータを追加
{for x:int=1 to 1000 do

  let v_record:RecordData = {RecordData}

  {v_record.set
    "colName",
     {TextFlowBox width = 150pt, "カラム名" & x}
  }
  
  {v_record.set
    "dataField",
     {TextField width = 150pt}
  }
  
  {v_recSet.append v_record}
}

||RecordField,RecordGridColumn,RecordSetをもとにRecordGridを作成
{let v_recGrid:RecordGrid = {RecordGrid
                            grid-line-color = "#758294",
                            alternate-row-background = "#E1E1E1",
                            select-current-record? = false,
                            cells-take-focus? = false ,
                            width = 320,
                            height = 300,
                            header-options ={RecordGridRowOptions
                                              background = "#B0D0FF",halign = "left"},
                            background="white",
                            record-source = v_recSet,
                            display-navigation-panel? = false,
                            display-record-selectors? = false,
                            {splice v_recGridColumnArray}}
}

{value v_box}
{v_box.add v_recGrid}

||処理時間出力
{output "RecordGridを使って作成:" & {v_sw.elapsed} & "で表示完了"}

 この結果は、Tableを使った場合が「1.063秒」で、RecordGridの場合が「0.091s」でした。 次に、データ件数を100件に減らして試してみたところ、Tableが「0.093秒」、RecordGridの場合が「0.019s」でした。

 以上の結果から、RecordGridを使うと、データ件数の増減から受ける影響はさほどなく、ほぼ同じレスポンスで処理できることがわかります。

まとめ

 画面描画にかかる時間を短縮したい場合、配置するコントロールの数を少なくするのが1番ですが、そうもいかない場合は「TabContainer」や「RecordGrid」の利用を検討してみてはいかがでしょうか。また、よく確認すると「HBox」や「VBox」など必要のないコンテナが画面に含まれている場合もあります。こういったものもレスポンスを悪くする原因になるので、画面のコントロールを今一度見直してみると、改善につながるかもしれません。

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
Curlで構築する長崎電子県庁システム(DBメンテナンスツール編)連載記事一覧

もっと読む

この記事の著者

株式会社ドゥアイネット 湯川栄太(ドゥアイネット ユカワエイタ)

【湯川栄太】株式会社ドゥアイネットに勤務するプログラマーです。CurlやFlexを使ってRIAの開発を担当しています。最近はマッシュアップに興味があります。開発日記http://blog.doinet.co.jp/CurlApplication Award2006http://www.curlap.com/award2006/index.htmlMashupAward4http://mashupaward.jp/entry_list/?posted=316

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3406 2009/01/06 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング