私は自分のウェブサイトのさまざまな側面を高速化しようとしています。
このサイトは、ショッピング サイトのさまざまな検索ページが遅いです。これにはいくつかの潜在的な理由があり、その 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 つのネストされたクエリと結合を使用します)。