- PR -

クリスタルレポート データセットを渡す際の処理時間

1
投稿者投稿内容
とういてたまし
会議室デビュー日: 2009/02/12
投稿数: 4
投稿日時: 2009-02-12 10:51
クリスタルレポートで帳票を出力するプログラムを作成していますが、
データセットをレポートエンジンに渡す箇所で
時間がかかっています。

開発環境で作成した帳票出力プログラムを
実行環境で実行するとデータセットをレポートエンジンに渡す箇所で時間がかかります。
90秒ほど掛かっています。
開発環境では0.5秒ほどかかります。

ミニマムコードを作成して検証しましたが
マシンの性能以外の原因が分かりません。
なぜ時間がかかってしまうのかみなさんの意見をお聞かせください。

開発環境
Visual Studio 2008
Crystal Reports Basic for Visual Studio 2008
OS:XP pro sp2
CPU:Core2Duo 2GHz
Memory:3GB

実行環境
OS:Vista
CPU:Celelon 1.8GHz
Memory:1GB

実行環境へはVisualStudio2008で作成したセットアップを使用しています。
セットアップには必須コンポーネントとして
.NET Framework3.5
Crystal Report Basic for Visual Stuidio 2008
Microsoft Visual Studio 2008 Report Viewer
を含めています。

以下が検証用に作成したミニマムコードです。
コード:
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnPreview_Click(object sender, EventArgs e)
        {
            Stopwatch sw = Stopwatch.StartNew();

            // レポートに設定するデータ作成
            DataSet1 dataset = new DataSet1();
            DataRow row = dataset.DataTable1.NewRow();
            row["no1"] = "hogeNo1";
            row["no2"] = "hogeNo2";
            row["no3"] = "hogeNo3";
            dataset.DataTable1.Rows.Add(row);

            sw.Stop();
            OutLog4Debug("データセット作成", sw.ElapsedMilliseconds);

            sw = Stopwatch.StartNew();

            // レポートオブジェクト作成
            CrystalReport1 report = new CrystalReport1();

            sw.Stop();
            OutLog4Debug("レポートオブジェクト作成", sw.ElapsedMilliseconds);

            sw = Stopwatch.StartNew();
            report.SetDataSource(dataset);
            sw.Stop();
            OutLog4Debug("レポートオブジェクトにデータセット設定", sw.ElapsedMilliseconds);

            sw = Stopwatch.StartNew();
            // プレビュー
            using (Preview pre = new Preview())
            {
                pre.Report = report;
                sw.Stop();
                OutLog4Debug("プレビューにレポートオブジェクト設定", sw.ElapsedMilliseconds);
                pre.ShowDialog();
            }
        }

        private void OutLog4Debug(object target, long time)
        {
            using (System.IO.StreamWriter sw = new System.IO.StreamWriter(@"c:\TestReport\ReportTestLog.txt", true))
            {
                //sw.WriteLine("-------{0}{1}", DateTime.Now, "-------");
                sw.WriteLine("#############################################################################");
                sw.WriteLine(target + ":" + time);
                sw.WriteLine("#############################################################################");
                
                //sw.WriteLine("---------------------------------------------");
            }
        }
    }



以下が実行環境(Vista)で実行した結果です。
#############################################################################
データセット作成:11
#############################################################################
#############################################################################
レポートオブジェクト作成:466
#############################################################################
#############################################################################
レポートオブジェクトにデータセット設定:91354
#############################################################################
#############################################################################
プレビューにレポートオブジェクト設定:399
#############################################################################
とういてたまし
会議室デビュー日: 2009/02/12
投稿数: 4
投稿日時: 2009-02-12 11:27
追記です。

一度レポート呼び出しを終えると
次回からは時間はかかりません。
レポートオブジェクトにデータセット設定は0.1秒ほどです。
とういてたまし
会議室デビュー日: 2009/02/12
投稿数: 4
投稿日時: 2009-02-12 13:59
http://social.msdn.microsoft.com/forums/ja-JP/vbgeneralja/thread/296708fe-b2ff-4a79-9daf-39226eb47aa6/

おそらく上記と同じ問題のようです。

それにしても90秒は掛かりすぎですが。。。
デューン
大ベテラン
会議室デビュー日: 2004/04/21
投稿数: 174
お住まい・勤務地: Tokyo
投稿日時: 2009-02-13 16:36
キャッシュの線は私も少し思いました。

手元にCrystalReportsがないので切り分けできませんが、

ありそうな話としては
1.レンダリングエンジンなどレポート機能の初回読み込みに時間がかかる
2.レンダリングそのものに時間がかかるが2回目以降はキャッシュされているので速い
3.初回のグラフィック領域確保に時間がかかる
あたりなのでしょうか。

複数のレポート(レポートA,レポートB)を作成しておいて、
起動時にレポートAを無条件で作成
( reportA.SetDataSource(dataset);まで)

起動後にレポートBを作成
で、キャッシュか否かはある程度確認できるかもしれません。

いずれにせよ、「どこで遅くするか」という話になっちゃいそうですけど。



indigo-x
大ベテラン
会議室デビュー日: 2008/02/21
投稿数: 207
お住まい・勤務地: 太陽の塔近く
投稿日時: 2009-02-13 17:49
(何の根拠もありませんが)

型付DataSetを使っていますか?コード上では使っているような、いないような。。。

正しく型付で処理すればおそらく少しは早くなると思います。

(型が無いのでColumnsを見るorリフレクション?使用していて遅いのでは)


[ メッセージ編集済み 編集者: indigo-x 編集日時 2009-02-13 18:03 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2009-02-14 02:55
引用:

とういてたましさんの書き込み (2009-02-12 10:51) より:

レポートオブジェクトにデータセット設定:91354


うーん、構成事態が複雑なレポートでないとここまで酷いのには出くわさないです (たとえば、サブ レポートが存在するとか、データのリレーションが複雑だとか)。 レポートの構成と、念のため DataSet の件数を教えて頂けないでしょうか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
とういてたまし
会議室デビュー日: 2009/02/12
投稿数: 4
投稿日時: 2009-02-17 12:01
ありがとうございます。

引用:

ありそうな話としては
1.レンダリングエンジンなどレポート機能の初回読み込みに時間がかかる
2.レンダリングそのものに時間がかかるが2回目以降はキャッシュされているので速い
3.初回のグラフィック領域確保に時間がかかる
あたりなのでしょうか。


私も上記1,2だと思いまして
バックグラウンドで初回読み込むを行うことにいたしました。
対応策になっていませんが。。。

引用:

型付DataSetを使っていますか?コード上では使っているような、いないような。。。


確認してみたところ型付DataSetを使用していました。
サンプルコードで使用している"DataSet1",DataSet1.DataTable1"ですが、
VisualStudioから自動生成したもので、DataTable1の各カラムはデフォルトで、System.Stringでした。

引用:

レポートの構成と、念のため DataSet の件数を教えて頂けないでしょうか?



レポートはVisualStudioから作成した「空のレポート」です。
サブレポートも設定していません。
DataSetの件数ですが、
1つのDatatableを設定しており、
Datatableには1行設定しています。
Datatableのカラムは
row["no1"] = "hogeNo1";
row["no2"] = "hogeNo2";
row["no3"] = "hogeNo3";
の3カラムです。
1

スキルアップ/キャリアアップ(JOB@IT)