我正在努力加快我网站的各个方面。
该网站是一个购物网站,各种搜索页面都很慢。这有几个潜在的原因,一个是使用图像。
另一个晚上,我创建了一个为我的Facebook OG标签生成缩略图的功能。该函数将方形图像写入服务器400px x 400px,通过平铺搜索查询生成的前几个(最多14个)产品图像创建。
在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”),因此所处理的所有图像大约为50x50像素,因此非常小,无法加载并确定宽高比
我的服务器上存储了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秒,我不知道这次是如何扩展到实际应用程序的。我已经根据我的了解优化了这个查询和表(它使用了一个嵌套查询和连接)。