私は、大きなテーブルで発生しているパフォーマンスの問題を追跡しようとしている jQuery 初心者です。とりわけ、列幅をヘッダー幅または行幅の最大値に設定する自家製のテーブル ウィジェットがあります。
10 行 x 500 列のテーブルでは、テーブルが 1 秒未満でレンダリングできることを考えると、これにはほぼ 40 秒 (!) かかることがあります。
関数全体は次のとおりです。
var dataTable = this._div.find('.data-table');
var headerTable = this._div.find('.data-header-table');
if (dataTable.length === 0 || headerTable.length === 0) {
return;
}
dataTable = dataTable[0];
headerTable = headerTable[0];
if (dataTable.rows.length === 0) {
return;
}
var dataTr = dataTable.rows[0];
var headerTr = headerTable.rows[headerTable.rows.length - 1];
var marginColumnWidths =
$(dataTr.cells[0]).outerWidth(true) +
$(dataTr.cells[1]).outerWidth(true) +
$(dataTr.cells[2]).outerWidth(true) -
DOM.getHPaddings($(headerTr.cells[0])) + 1;
$(headerTable)
.find('> tbody > tr > td:first-child')
.width('1%')
.children()
.first()
.width(marginColumnWidths);
for (var i = 1; i < headerTr.cells.length; i++) {
var headerTd = $(headerTr.cells[i]);
var dataTd = $(dataTr.cells[i + 2]);
var commonWidth = Math.max(
Math.min(headerTd.width(), 100),
dataTd.width()
);
headerTd.width('1%').find('> div').width(commonWidth);
dataTd.children().first().width(commonWidth);
}
交換したら
var commonWidth = Math.max(
Math.min(headerTd.width(), 100),
dataTd.width()
);
定数で
var commonWidth = 100;
実行時間は 38 秒から 1 秒未満に短縮されました。これは、新しい幅の設定ではなく、現在の幅の読み取り/計算に問題があることを示しています。私が行ったプロファイリング/サンプリングから、jQuery は CSS の計算をいじるのに途方もない時間を費やしているようです。
これを行うためのより効率的な方法を推奨できる人はいますか?
編集:
css("width") と outerWidth() の両方を試しましたが、パフォーマンスに大きな変化はありませんでした。jQuery 1.7.2 を使用していましたが、1.8.1 にアップグレードしてもパフォーマンスは大幅に変わりませんでした。