0

私は自分のウェブサイトのさまざまな側面を高速化しようとしています。

このサイトは、ショッピング サイトのさまざまな検索ページが遅いです。これにはいくつかの潜在的な理由があり、その 1 つは画像の操作です。

先日、Facebook OG タグのサムネイルを生成する関数を作成しました。この関数は、検索クエリによって生成された最初の数個 (最大 14 個) の製品画像を並べて作成した 400px x 400px の正方形の画像をサーバーに書き込みます。

このスクリプトをtest.aspxファイルに対して完全に分離して実行すると、妥当な読み込み時間が得られますが、ブラウザーで何も返さない場合でも、速度を上げることはできません。このプロセスを実行するだけで約 3 秒かかり、明らかに拡張されます。ライブサイト全体で速度が低下します。

コード全体は次のとおりです。

Function mergeImgs(idList, imgList, head, fileName) As String

    Try
        Dim maxRows = HttpContext.Current.Request.QueryString("r")
        Dim imgDim = 400
        Dim Image3 As New Bitmap(imgDim, imgDim)
        Dim g As Graphics = Graphics.FromImage(Image3)

        Dim i = 0
        Dim left = 0
        Dim rows = 0
        For Each item In idList
            Dim img = Common.getImageUrl(idList(i), imgList(i), "server", "-tb")
            i += 1
            If img <> "/Images/awaiting.png" Then

                Dim imageData As System.Drawing.Image = System.Drawing.Image.FromFile(img)
                Dim aspect As Double = imageData.Width / imageData.Height ' determine aspect and decide how to display image

                Dim Image1
                Dim fixedHeight = imgDim / maxRows
                Dim objGraphic As System.Drawing.Image = System.Drawing.Image.FromFile(img)

                Dim aspectRatio = objGraphic.Height / objGraphic.Width
                Dim reduction = fixedHeight / objGraphic.Height
                Dim newwidth = objGraphic.Width * reduction
                Image1 = New Bitmap(objGraphic, objGraphic.Width * reduction, fixedHeight)

                g.DrawImage(Image1, New Point(left, fixedHeight * rows))
                If left >= imgDim Then
                    rows += 1
                    left = 0
                ElseIf left < imgDim Then
                    left += newwidth
                ElseIf left < imgDim AndAlso rows = maxRows Then
                    Exit For
                End If
            End If
        Next

        Image3.Save(HttpContext.Current.Server.MapPath("/" & fileName), System.Drawing.Imaging.ImageFormat.Jpeg)

        Return rootUrl & fileName

        g.Dispose()
        g = Nothing

    Catch ex As Exception
        Return ("<P>" & ex.ToString)
    End Try
End Function

getImageUrlアイテム ID に基づいてディレクトリ構造を書き出す単純な一連のロジックである外部関数があります。これは高速なので、それを保持することはまったくありません。

関数に渡される変数は次のとおりです。

idList = a generic List(of String) ' a list of item IDs
imgList = a generic List(of String) ' a list of image names (image names only stored in DB)
head = the Page.Header ' not actually needed in this prototype, but aimed to allow this to write the OG tag to the Page Header
fileName = simply the name to give the generated image file

からのセクションだと思わずにはいられない

Dim imageData As System.Drawing.Image = System.Drawing.Image.FromFile(img)

以降は潜在的に高速化される可能性があります。これにより、ロードされた画像の縦横比が計算され、サイズが再計算されてすべて同じ高さになり、タイルがきちんとした行に配置されます。

Dim img = Common.getImageUrl(idList(i), imgList(i), "server", "-tb")

この行は、関連する画像のサムネイル バージョン (最後の変数の「-tb」) をロードします。したがって、処理されるすべての画像は約 50x50px であるため、ロードしてアスペクト比を決定するには非常に小さいです。

私のサーバーには各画像の4つのバージョンが保存されており、ウェブサイトで高速に表示するために4つの異なるサイズで、ここにロードされたさまざまな画像をいじっていますが、スクリプトのロード時間にはほとんど違いがないようです.

System.Drawing.Image.FromFile(img)画像を読み込んでその幅と高さを決定するために使用できるものよりも速いものはありますか?

私のウェブサイトには、画像の寸法を決定してから何かを行う必要がある状況が他にもいくつかありますが、すべてが少し遅いようです。

どんなアドバイスでも大歓迎です!

参考までに、上記のコードで生成された画像の例を次に示します

http://www.hgtrs.com/recents.jpg

これは、このページから返された製品から生成されます (読み込みが遅い可能性があります!)。

http://www.hgtrs.com/search.aspx?Type=recents

私のtest.aspxファイルにはデータベースへの呼び出しも含まれていると述べておく必要があります。直接使用されたクエリをテストしたところ、クエリ時間は 0.18 秒でした。この時間が実際のアプリケーションにどのように拡張されるかはわかりません。このクエリとテーブルを最適化しました (1 つのネストされたクエリと結合を使用します)。

4

0 に答える 0