我的程序必须将照片添加到Word文档表中。面对这样一个事实,在Word 2013中,该程序的运行速度要慢得多,甚至挂起。我开始寻找问题区域,似乎问题出在添加图像时占用的内存中。
我通过InlinesShapes.AddPicture
方法将图像添加到Word 2013表中。
之后,每个图像的已用内存将增加〜50 Mb。当达到约600 mb时,它将停止以该速率增长,并且增长约为1 mb。然后,在某个时候,Word最多清除200条内存,然后重新全部清除。
但是,如果我在Word 2007中执行相同的操作,则始终占用的内存小于1 kb。
我的笔记本上的Word 2007(Win 8.1,i5-4300u),Word 2013安装在其他计算机上(带有Win 7的虚拟桌面,至强E5)。
我要添加用相机拍摄的普通照片,例如:4160x3120、72 dpi,24位,500 Kb大小,JPG。
具有已用内存计算的示例代码
Sub A()
' >-- SOME CODE --<
Dim objCell As Word.Cell
'user method that return first free Word.Cell from table
Set objCell = TableManager.Get_FreeCell(objTable)
'clear
Tools.MemCheck "<- mem before paste"
objCell.Range.InlineShapes.AddPicture sFilePath
'clear
Tools.MemCheck "-> mem after paste"
' >-- SOME CODE --<
Set objCell = Nothing
End Sub
Word2013的输出
296.156 Mb <- mem before paste
345.793 Mb -> mem after Paste
346.504 Mb <- mem before paste
396.18 Mb -> mem after Paste
Word2007的输出
109.867 Mb <- mem before paste
109.871 Mb -> mem after Paste
109.871 Mb <- mem before paste
109.879 Mb -> mem after Paste
109.887 Mb <- mem before paste
109.887 Mb -> mem after Paste
有MemCheck的代码。将mobjSWbemServices声明为全局,以将其排除在问题之外。
Dim mobjSWbemServices as Object
Sub MemCheck(Optional ByVal sDescription As String = vbNullString)
If mobjSWbemServices is nothing then Set mobjSWbemServices = GetObject("winmgmts:")
Dim GetMemUsage As Double
GetMemUsage = mobjSWbemServices.Get( _
"Win32_Process.Handle='" & _
GetCurrentProcessId & "'").WorkingSetSize / 1024 / 1024
Debug.Print Round(GetMemUsage, 3); " Mb"; vbTab; sDescription
'GetCurrentProcessId is Declared Library:
'Private Declare PtrSafe Function GetCurrentProcessId Lib "kernel32" () As Long
'Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
End Sub
那么可能是什么问题?我是在做错什么还是错误,需要安装一些更新?
答案 0 :(得分:0)
在Word 2007(和2010)与Word 2013(和更高版本)之间使用的图形引擎发生了重大变化。 可能是一个因素。我还记得,在Word 2013(及更高版本)中对象模型的速度也较慢,部分原因是出于安全原因。因此,您可能无能为力。
您可以尝试的一件事是清除Word的UNDO堆栈并显式保存文档。这样可以减少Word为了支持撤消而正在管理的对象数量,并可以加快处理速度。