描画速度(パフォーマンス)を向上させる方法(2)
対象製品
SPREAD for Windows Forms 7.0J
詳細
表示速度の高速化の手段としては、スプレッドのモデルクラスを使用する方法があります。
例えばセルにデータを設定する場合は、Cells(row, Col).Value またはCells(row, Col).Text または、SheetのSetText、SetValueメソッドを使用するよりも、データモデルを使用したほうが処理が高速になります。
同様に、セルの罫線やセル型などの設定を行う場合も、セルのCellTypeプロパティやBorderプロパティを設定するよりも、スタイルモデルを使用したほうが高速になります。また、大量のセルにスタイルを設定する場合は、名前付きスタイルオブジェクトを使用することで、リソースの消費も最小限に抑え、更に高速な処理を行うことができます。
例えば、日付時刻型セル、罫線、現在日付時刻をセルに設定する場合、次のような結果となります。
下記サンプルコードでは、Button1でセルに直接設定し、Button2ではスプレッドのモデルクラスを使用しています。また、スプレッドのモデルクラスには、下記で使用したデータモデル、スタイルモデルのほか、セルの連結を管理するスパンモデル等があります。
◎サンプルコード(VB)
◎サンプルコード(C#)
例えばセルにデータを設定する場合は、Cells(row, Col).Value またはCells(row, Col).Text または、SheetのSetText、SetValueメソッドを使用するよりも、データモデルを使用したほうが処理が高速になります。
同様に、セルの罫線やセル型などの設定を行う場合も、セルのCellTypeプロパティやBorderプロパティを設定するよりも、スタイルモデルを使用したほうが高速になります。また、大量のセルにスタイルを設定する場合は、名前付きスタイルオブジェクトを使用することで、リソースの消費も最小限に抑え、更に高速な処理を行うことができます。
例えば、日付時刻型セル、罫線、現在日付時刻をセルに設定する場合、次のような結果となります。
【セルの数】500列×500行
【PCスペック】CPU:Intel Core i7-3770 3.40GHz 3.40GHz メモリ:12.0GB
-------------------------------------------------------
◎セルに直接設定した場合:9002ミリ秒
◎スタイルモデルおよびデータモデルを使用した場合:2079ミリ秒
【PCスペック】CPU:Intel Core i7-3770 3.40GHz 3.40GHz メモリ:12.0GB
-------------------------------------------------------
◎セルに直接設定した場合:9002ミリ秒
◎スタイルモデルおよびデータモデルを使用した場合:2079ミリ秒
下記サンプルコードでは、Button1でセルに直接設定し、Button2ではスプレッドのモデルクラスを使用しています。また、スプレッドのモデルクラスには、下記で使用したデータモデル、スタイルモデルのほか、セルの連結を管理するスパンモデル等があります。
◎サンプルコード(VB)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' 名前付きスタイルオブジェクトを作成し、セル型/罫線を設定
Dim ns As New FarPoint.Win.Spread.NamedStyle("MyStyle")
ns.CellType = New FarPoint.Win.Spread.CellType.DateTimeCellType
ns.Border = New FarPoint.Win.ComplexBorder(New FarPoint.Win.ComplexBorderSide(FarPoint.Win.ComplexBorderSideStyle.Dashed))
' スプレッドのコレクションに登録
FpSpread1.NamedStyles.Add(ns)
End Sub
'=====================================
' セルに直接設定する場合
'=====================================
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim i As Integer
Dim j As Integer
Dim start As DateTime = Now
'ループ処理で全てのセルにセル型、罫線、値を設定
With FpSpread1.ActiveSheet
For i = 0 To 499
For j = 0 To 499
.Cells(i, j).CellType = New FarPoint.Win.Spread.CellType.DateTimeCellType
.Cells(i, j).Border = New FarPoint.Win.ComplexBorder(New FarPoint.Win.ComplexBorderSide(FarPoint.Win.ComplexBorderSideStyle.Dashed))
.Cells(i, j).Value = Now
Next
Next
End With
Me.Text = String.Format("{0:###,###}ミリ秒", DateTime.Now.Subtract(start).TotalMilliseconds)
End Sub
'=====================================
' モデルクラスを使用する場合
'=====================================
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim i, j As Integer
Dim start As DateTime = Now
'データモデルを取得
Dim datamodel As FarPoint.Win.Spread.Model.DefaultSheetDataModel = CType(FpSpread1.ActiveSheet.Models.Data, FarPoint.Win.Spread.Model.DefaultSheetDataModel)
'スタイルモデルを取得
Dim stylemodel As FarPoint.Win.Spread.Model.DefaultSheetStyleModel = CType(FpSpread1.ActiveSheet.Models.Style, FarPoint.Win.Spread.Model.DefaultSheetStyleModel)
'コレクションから名前付きスタイルオブジェクトを取得
Dim style As FarPoint.Win.Spread.StyleInfo = FpSpread1.NamedStyles.Find("MyStyle")
'ループ処理で全てのセルにスタイルと値を設定
For i = 0 To 499
For j = 0 To 499
stylemodel.SetDirectInfo(i, j, style)
datamodel.SetValue(i, j, Now)
Next
Next
Me.Text = String.Format("{0:###,###}ミリ秒", DateTime.Now.Subtract(start).TotalMilliseconds)
End Sub
'=====================================
' スプレッドシートをリセット
'=====================================
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
FpSpread1.ActiveSheet.Reset()
End Sub
' 名前付きスタイルオブジェクトを作成し、セル型/罫線を設定
Dim ns As New FarPoint.Win.Spread.NamedStyle("MyStyle")
ns.CellType = New FarPoint.Win.Spread.CellType.DateTimeCellType
ns.Border = New FarPoint.Win.ComplexBorder(New FarPoint.Win.ComplexBorderSide(FarPoint.Win.ComplexBorderSideStyle.Dashed))
' スプレッドのコレクションに登録
FpSpread1.NamedStyles.Add(ns)
End Sub
'=====================================
' セルに直接設定する場合
'=====================================
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim i As Integer
Dim j As Integer
Dim start As DateTime = Now
'ループ処理で全てのセルにセル型、罫線、値を設定
With FpSpread1.ActiveSheet
For i = 0 To 499
For j = 0 To 499
.Cells(i, j).CellType = New FarPoint.Win.Spread.CellType.DateTimeCellType
.Cells(i, j).Border = New FarPoint.Win.ComplexBorder(New FarPoint.Win.ComplexBorderSide(FarPoint.Win.ComplexBorderSideStyle.Dashed))
.Cells(i, j).Value = Now
Next
Next
End With
Me.Text = String.Format("{0:###,###}ミリ秒", DateTime.Now.Subtract(start).TotalMilliseconds)
End Sub
'=====================================
' モデルクラスを使用する場合
'=====================================
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim i, j As Integer
Dim start As DateTime = Now
'データモデルを取得
Dim datamodel As FarPoint.Win.Spread.Model.DefaultSheetDataModel = CType(FpSpread1.ActiveSheet.Models.Data, FarPoint.Win.Spread.Model.DefaultSheetDataModel)
'スタイルモデルを取得
Dim stylemodel As FarPoint.Win.Spread.Model.DefaultSheetStyleModel = CType(FpSpread1.ActiveSheet.Models.Style, FarPoint.Win.Spread.Model.DefaultSheetStyleModel)
'コレクションから名前付きスタイルオブジェクトを取得
Dim style As FarPoint.Win.Spread.StyleInfo = FpSpread1.NamedStyles.Find("MyStyle")
'ループ処理で全てのセルにスタイルと値を設定
For i = 0 To 499
For j = 0 To 499
stylemodel.SetDirectInfo(i, j, style)
datamodel.SetValue(i, j, Now)
Next
Next
Me.Text = String.Format("{0:###,###}ミリ秒", DateTime.Now.Subtract(start).TotalMilliseconds)
End Sub
'=====================================
' スプレッドシートをリセット
'=====================================
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
FpSpread1.ActiveSheet.Reset()
End Sub
◎サンプルコード(C#)
private void Form1_Load(object sender, EventArgs e)
{
// 名前付きスタイルオブジェクトを作成し、セル型/罫線を設定
FarPoint.Win.Spread.NamedStyle ns = new FarPoint.Win.Spread.NamedStyle("MyStyle");
ns.CellType = new FarPoint.Win.Spread.CellType.DateTimeCellType();
ns.Border = new FarPoint.Win.ComplexBorder(new FarPoint.Win.ComplexBorderSide(FarPoint.Win.ComplexBorderSideStyle.Dashed));
// スプレッドのコレクションに登録
fpSpread1.NamedStyles.Add(ns);
}
//=====================================
// セルに直接設定する場合
//=====================================
private void button1_Click(object sender, EventArgs e)
{
int i = 0;
int j = 0;
DateTime start = DateTime.Now;
//ループ処理で全てのセルにセル型、罫線、値を設定
for (i = 0; i <= 499; i++)
{
for (j = 0; j <= 499; j++)
{
fpSpread1.ActiveSheet.Cells[i, j].CellType = new FarPoint.Win.Spread.CellType.DateTimeCellType();
fpSpread1.ActiveSheet.Cells[i, j].Border = new FarPoint.Win.ComplexBorder(new FarPoint.Win.ComplexBorderSide(FarPoint.Win.ComplexBorderSideStyle.Dashed));
fpSpread1.ActiveSheet.Cells[i, j].Value = DateTime.Now;
}
}
this.Text = string.Format("{0:###,###}ミリ秒", DateTime.Now.Subtract(start).TotalMilliseconds);
}
//=====================================
// モデルクラスを使用する場合
//=====================================
private void button2_Click(object sender, EventArgs e)
{
int i = 0;
int j = 0;
DateTime start = DateTime.Now;
//データモデルを取得
FarPoint.Win.Spread.Model.DefaultSheetDataModel datamodel = (FarPoint.Win.Spread.Model.DefaultSheetDataModel)fpSpread1.ActiveSheet.Models.Data;
//スタイルモデルを取得
FarPoint.Win.Spread.Model.DefaultSheetStyleModel stylemodel = (FarPoint.Win.Spread.Model.DefaultSheetStyleModel)fpSpread1.ActiveSheet.Models.Style;
//コレクションから名前付きスタイルオブジェクトを取得
FarPoint.Win.Spread.StyleInfo style = fpSpread1.NamedStyles.Find("MyStyle");
//ループ処理で全てのセルにスタイルと値を設定
for (i = 0; i <= 499; i++)
{
for (j = 0; j <= 499; j++)
{
stylemodel.SetDirectInfo(i, j, style);
datamodel.SetValue(i, j, DateTime.Now);
}
}
this.Text = string.Format("{0:###,###}ミリ秒", DateTime.Now.Subtract(start).TotalMilliseconds);
}
//=====================================
// スプレッドシートをリセット
//=====================================
private void button3_Click(object sender, EventArgs e)
{
fpSpread1.ActiveSheet.Reset();
}
{
// 名前付きスタイルオブジェクトを作成し、セル型/罫線を設定
FarPoint.Win.Spread.NamedStyle ns = new FarPoint.Win.Spread.NamedStyle("MyStyle");
ns.CellType = new FarPoint.Win.Spread.CellType.DateTimeCellType();
ns.Border = new FarPoint.Win.ComplexBorder(new FarPoint.Win.ComplexBorderSide(FarPoint.Win.ComplexBorderSideStyle.Dashed));
// スプレッドのコレクションに登録
fpSpread1.NamedStyles.Add(ns);
}
//=====================================
// セルに直接設定する場合
//=====================================
private void button1_Click(object sender, EventArgs e)
{
int i = 0;
int j = 0;
DateTime start = DateTime.Now;
//ループ処理で全てのセルにセル型、罫線、値を設定
for (i = 0; i <= 499; i++)
{
for (j = 0; j <= 499; j++)
{
fpSpread1.ActiveSheet.Cells[i, j].CellType = new FarPoint.Win.Spread.CellType.DateTimeCellType();
fpSpread1.ActiveSheet.Cells[i, j].Border = new FarPoint.Win.ComplexBorder(new FarPoint.Win.ComplexBorderSide(FarPoint.Win.ComplexBorderSideStyle.Dashed));
fpSpread1.ActiveSheet.Cells[i, j].Value = DateTime.Now;
}
}
this.Text = string.Format("{0:###,###}ミリ秒", DateTime.Now.Subtract(start).TotalMilliseconds);
}
//=====================================
// モデルクラスを使用する場合
//=====================================
private void button2_Click(object sender, EventArgs e)
{
int i = 0;
int j = 0;
DateTime start = DateTime.Now;
//データモデルを取得
FarPoint.Win.Spread.Model.DefaultSheetDataModel datamodel = (FarPoint.Win.Spread.Model.DefaultSheetDataModel)fpSpread1.ActiveSheet.Models.Data;
//スタイルモデルを取得
FarPoint.Win.Spread.Model.DefaultSheetStyleModel stylemodel = (FarPoint.Win.Spread.Model.DefaultSheetStyleModel)fpSpread1.ActiveSheet.Models.Style;
//コレクションから名前付きスタイルオブジェクトを取得
FarPoint.Win.Spread.StyleInfo style = fpSpread1.NamedStyles.Find("MyStyle");
//ループ処理で全てのセルにスタイルと値を設定
for (i = 0; i <= 499; i++)
{
for (j = 0; j <= 499; j++)
{
stylemodel.SetDirectInfo(i, j, style);
datamodel.SetValue(i, j, DateTime.Now);
}
}
this.Text = string.Format("{0:###,###}ミリ秒", DateTime.Now.Subtract(start).TotalMilliseconds);
}
//=====================================
// スプレッドシートをリセット
//=====================================
private void button3_Click(object sender, EventArgs e)
{
fpSpread1.ActiveSheet.Reset();
}
関連情報
キーワード
「パフォーマンス」