2017-03-28 18 views
0

オブジェクト配列のリストを使用してhtmlテーブルを構築していますが、非常に遅いです。それを最適化する方法はありますか?オブジェクト配列のリストの効率的な文字列連結

public String generateHtmlTable(List<Object[]> resultSet) { 
    totalRows = resultSet.size(); 

    StringBuilder sb = new StringBuilder(); 
    sb.append("<table width=\"900px\">"); 
    sb.append("<tr>"); 
    sb.append("<th width=\"10%\" align=\"left\"><b>col1</b></th>"); 
    sb.append("<th width=\"25%\" align=\"left\"><b>col2</b></th>"); 
    sb.append("<th width=\"20%\" align=\"left\"><b>col3</b></th>"); 
    sb.append("<th width=\"15%\" align=\"left\"><b>col4</b></th>"); 
    sb.append("<th width=\"10%\" align=\"left\"><b>col5</b></th>"); 
    sb.append("<th width=\"10%\" align=\"left\"><b>col6</b></th>"); 
    sb.append("<th width=\"10%\" align=\"left\"><b>col7</b></th>"); 
    sb.append("<th width=\"5%\" align=\"left\"><b>col8</b></th>"); 
    sb.append("<th width=\"5%\" align=\"left\"><b>col9</b></th>"); 
    sb.append("</tr>"); 
    for (Object[] row : resultSet) { 
     sb.append("<tr>"); 
     for (Object cell : row) { 
      sb.append("<td>"); 
      sb.append(((cell != null) ? cell.toString() : "")); 
      sb.append("</td>"); 

     } 
     sb.append("</tr>"); 
     rowsProcessed += 1; 
    } 
    sb.append("</table>"); 
    return sb.toString(); 
} 
+2

このコードは、あなたの 'resultSet'に何千ものセル/行がない限り、遅くはありません。プロファイラを使用してコードを実行すると、実際に処理時間が最も長いものを確認できます。 –

+0

もちろん、可読性を犠牲にして文字列を連結し、 'append()'の呼び出しを減らすことができます。 'sb.append(" ... "+" ... "+" ... "のようなもの);それは助けになるのでしょうか?試してみるといいでしょう。可能であれば、 '+'演算子も省略する方が良いでしょう。 – domsson

+0

フォローアップのコメント:http://stackoverflow.com/questions/5234147/why-stringbuilder-when-there-is-stringによると、 '+'を使用すると、おそらく同様に遅く/速くなります。しかし、あなたのコードが許せば、それを完全に省略し、すべてのセルを1回の呼び出しで追加することができます。それが助けになるかもしれない。 – domsson

答えて

2

いくつかのWebサーバーからの応答で(おそらく)ストリーミングする前に、結果HTMLをメモリに構築しています。レスポンス出力ストリームに直接書き込むことで、このようなバッファリングを避けることができます。これには2つの利点があります.1)応答を返す前にメモリ内に応答のコピーを作成していない。 2)データベースのすべての結果をスクロールする前に、バイトを戻しています。両方とも応答時間を短縮します。

ほとんどのシリアル化フレームワークは、 jax.rsがこれを行うか、独自のカスタムシリアル化をプラグインできます。あるいは、ある種のサーブレット・アプリケーションを使用している場合は、レスポンス・オブジェクトから直接ライターを取得できます。

関連する問題