PowerPoint性能下降

时间:2013-06-07 10:12:48

标签: performance vsto powerpoint

我们在PowerPoint中遇到了一个奇怪的问题:我们有一个基于.NET的加载项,它以编程方式在当前幻灯片中插入一组形状。第一次生成这组形状时,总操作需要不到一秒钟。 如果用户重复操作,持续时间会一次又一次地增加,直到它可以达到十五秒,可能更多(我们已停止测试该值)。 如果我们重新启动PowerPoint,则操作需要再少一秒钟才能完成。 我们试图在某些时间点调用GC.Collect,我们正在考虑完全重写形状集生成代码以按特定顺序生成所有形状,但这是一个非常昂贵的选择。 您对如何诊断此问题或如何解决此问题有其他建议吗?

一个简单的代码序列可以重现这个问题。

// Attach the callback below to a button in your add-in ribbon.
public void OnDevBtnReproduceRenderingPerformanceIssue(IRibbonControl control)
{
     // Generate a decent set of shapes on the current slide,
     // delete them, repeat until rendering time exceeds a certain value.
     var slide = (Slide)Globals.ThisAddIn.Application.ActiveWindow.View.Slide;
     var stopwatch = new Stopwatch();

     for (var iter = 0; iter < 1000; iter++)
     {
         stopwatch.Start();
         GenerateShapesSet(slide);
         DeleteAllShapes(slide);
         stopwatch.Stop();
         Debug.Print("Render+delete took {0} ms", stopwatch.ElapsedMilliseconds);
         stopwatch.Reset();
      }
 }

 private static void DeleteAllShapes(Slide slide)
 {
      while (slide.Shapes.Count > 0)
      {
         slide.Shapes[1].Delete();
      }
 }

 private static void GenerateShapesSet(Slide slide )
 {
     var shapesCount = 100;

      for (var iter = 0; iter < shapesCount; iter ++)
      {
          var shape = slide.Shapes.AddTextbox(
                MsoTextOrientation.msoTextOrientationHorizontal,
                100,
                100,
                100,
                100
                );
          shape.TextFrame2.TextRange.Text = "Test test test";
          shape.TextFrame2.TextRange.Font.Name = "+mn-lt";
      }
 }

我们已经尝试释放所有COM引用到形状,但这并没有解决问题。 当代码执行时,可以看到渲染+删除时间从200毫秒增加到10秒。

1 个答案:

答案 0 :(得分:1)

我找到了解决方案:在每个形状删除/创建批处理后,调用StartNewUndoEntry。 通过此调用,每个批次的渲染时间不再增加。