アプリ起動後の初回印刷プレビュー表示が遅くなる件

85 views
Skip to first unread message

大和物流 原子

unread,
Apr 3, 2024, 4:56:09 AMApr 3
to RapidReportサポート QAフォーラム
RapidReportサポート 御中

お世話になっております。
下記の点について教えていただけますでしょうか。

【情報】
開発言語:VB.NET
.NETバージョン:3.5
Rapid Reportバージョン:5.17.0.0
アプリケーション種類:デスクトップアプリケーション
OS: Windows Server 2019
※アプリケーション利用時は、Citrix Virutal App(旧XenApp)で実行。

【問い合わせ内容】
アプリケーション起動後の初回印刷プレビュー表示に30秒程度時間を要し、
2回目以降は1秒程度で印刷プレビューが表示される事象を確認しております。

また、Citrix Virutal App経由でアプリケーションを実行しておりますが、
端末で直接アプリケーションを起動しても同様の事象が発生しております。

つきましては、初回印刷プレビューの表示速度を改善する方法を教えていただけないでしょうか。

RapidReport

unread,
Apr 3, 2024, 9:35:20 PMApr 3
to RapidReportサポート QAフォーラム
プレビュー表示が行われるまでの処理のうち、どの部分で時間がかかっているのかを調べるために
以下のような形でStopwatchなどを利用して計測を行って頂きますようお願いいたします。

         Dim sw As New Stopwatch() 'このストップウォッチで時間計測
        sw.Start()
        Dim report As New Report(Json.Read("report.rrpt"))
        Console.WriteLine("帳票定義ファイル読込: " & sw.ElapsedMilliseconds())
        Dim dataTable = getDataTable() ' 帳票に渡すデータを取得
        Console.WriteLine("データ取得: " & sw.ElapsedMilliseconds())
        report.Fill(New ReportDataSource(dataTable))
        Console.WriteLine("帳票へデータ投入: " & sw.ElapsedMilliseconds())
        Dim pages As ReportPages = report.GetPages()
        Console.WriteLine("ページ分割: " & sw.ElapsedMilliseconds())
        Dim printer As New Printer(pages)
        Dim preview As New FmPrintPreview(printer)
        Console.WriteLine("プレビュー画面生成: " & sw.ElapsedMilliseconds())
        preview.ShowDialog()

2024年4月3日水曜日 17:56:09 UTC+9 大和物流 原子:

大和物流 原子

unread,
Apr 5, 2024, 2:33:05 AMApr 5
to RapidReportサポート QAフォーラム
お世話になっております。
弊社で計測した結果を送付致します。

2024年4月4日木曜日 10:35:20 UTC+9 RapidReport:
ラピッドレポート出力時レスポンス確認_ログ (2).XLSX

RapidReport

unread,
Apr 8, 2024, 1:13:27 AMApr 8
to RapidReportサポート QAフォーラム
計測結果の提示ありがとうございます。
小出しになりすみませんが、
時間がかかってしまっている帳票定義ファイル読込処理の内部をさらに細分化して、
以下のような計測をお願いできますでしょうか。

        Dim defStr = ""
        Using r = New StreamReader("report.rrpt")
            defStr = r.ReadToEnd()
        End Using
        Console.WriteLine("ファイル読込 " & sw.ElapsedMilliseconds)

        Dim def = Json.Read(New StringReader(defStr))
        Console.WriteLine("JSONをパース " & sw.ElapsedMilliseconds)

        Dim reportDesign As New ReportDesign(def)
        Console.WriteLine("デザインオブジェクトへ変換 " & sw.ElapsedMilliseconds)

        Dim report As New Report(reportDesign)
        Console.WriteLine("レポートオブジェクトへ変換 " & sw.ElapsedMilliseconds)

2024年4月5日金曜日 15:33:05 UTC+9 大和物流 原子:

大和物流 原子

unread,
Apr 10, 2024, 1:56:36 AMApr 10
to RapidReportサポート QAフォーラム

お世話になっております。
頂いたプログラムで計測致しました。
結果を送付致します。
結論ですが、下記の処理にて時間がかかっておりました。
②JSONをパース
③デザインオブジェクトへ変換
④レポートオブジェクトへ変換

何卒宜しくお願い致します。
2024年4月8日月曜日 14:13:27 UTC+9 RapidReport:
RapidReports_レスポンス詳細確認.xlsx

RapidReport

unread,
Apr 10, 2024, 8:46:31 PMApr 10
to RapidReportサポート QAフォーラム
調査いただきありがとうございます。

内容を見ますと、初回のJSONパースでのみ時間がかかっているようです。
Json.Readは以下ような単純な定義のクラス(モジュール)なのですが、
このソースコードを直接プロジェクトに含めても同じ現象となるでしょうか?
その際、内部的に何らかの例外が発生しているといったことはないでしょうか。

Imports Newtonsoft.Json
Imports System.IO

Public Module Json

    Public Function Read(path As String) As Hashtable
        Using reader As New StreamReader(path)
            Return Read(reader)
        End Using
    End Function

    Public Function Read(reader As TextReader) As Hashtable
        Return Read(New JsonTextReader(reader))
    End Function

    Public Function Read(reader As JsonReader) As Hashtable
        If reader.Read Then
            Return readHash(reader)
        Else
            Return Nothing
        End If
    End Function

    Private Function readNode(reader As JsonReader) As Object
        Select Case reader.TokenType
            Case JsonToken.StartArray
                Return readArray(reader)
            Case JsonToken.StartObject
                Return readHash(reader)
            Case Else
                Return reader.Value
        End Select
    End Function

    Private Function readArray(reader As JsonReader) As ArrayList
        Dim ret As New ArrayList
        Do While reader.Read
            If reader.TokenType = JsonToken.EndArray Then
                Return ret
            End If
            ret.Add(readNode(reader))
        Loop
        Return ret
    End Function

    Private Function readHash(reader As JsonReader) As Hashtable
        Dim ret As New Hashtable
        Do While reader.Read
            Dim key As Object = Nothing
            If reader.TokenType = JsonToken.EndObject Then
                Return ret
            End If
            If reader.TokenType = JsonToken.PropertyName Then
                key = reader.Value
                reader.Read()
            End If
            ret.Add(key, readNode(reader))
        Loop
        Return ret
    End Function

End Module

2024年4月10日水曜日 14:56:36 UTC+9 大和物流 原子:

大和物流 原子

unread,
Apr 11, 2024, 12:43:22 AMApr 11
to RapidReportサポート QAフォーラム
お世話になっております。
下記、ご回答致します。

>このソースコードを直接プロジェクトに含めても同じ現象となるでしょうか?
頂いたソースコードで試しましたが、初回起動時のプレビュー表示の時間はかわらなかったです。

>その際、内部的に何らかの例外が発生しているといったことはないでしょうか。
例外について、確認しましたが発生しておりませんでした。

何卒宜しくお願い致します。

2024年4月11日木曜日 9:46:31 UTC+9 RapidReport:

RapidReport

unread,
Apr 14, 2024, 7:27:35 PMApr 14
to RapidReportサポート QAフォーラム
この場合でも現象が発生するのであれば、
(確証はありませんが)JSON入出力ライブラリのNewtonsoft.Json
の機能を初回に利用する際に時間がかかっているように思われます。

Newtonsoft.Jsonへの参照はどのように設定されているでしょうか?
下記ドキュメントの方法(NuGetから取得)でしょうか?

また、RapidReportのインストールフォルダには.NET Framework + VBでのサンプルも用意されています。
(インストールフォルダ)\example\vb

このサンプルでも同様の現象が発生するでしょうか?


2024年4月11日木曜日 13:43:22 UTC+9 大和物流 原子:
Reply all
Reply to author
Forward
0 new messages