title: Why is UIBezierPath faster than Core Graphics path?
body: <p>I was playing around with drawing paths, and I noticed that in at least some cases, UIBezierPath outperforms what I thought would be a Core Graphics equivalent. The <code>-drawRect:</code> method below creates two paths: one UIBezierPath, and one CGPath. The paths are identical except for their locations, but stroking the CGPath takes roughly twice as long as stroking the UIBezierPath.</p>
  
  <pre><code>- (void)drawRect:(CGRect)rect
  {
      CGContextRef ctx = UIGraphicsGetCurrentContext();
  
      // Create the two paths, cgpath and uipath.
      CGMutablePathRef cgpath = CGPathCreateMutable();
      CGPathMoveToPoint(cgpath, NULL, 0, 100);
  
      UIBezierPath *uipath = [[UIBezierPath alloc] init];
      [uipath moveToPoint:CGPointMake(0, 200)];
  
      // Add 200 curve segments to each path.
      int iterations = 200;
      CGFloat cgBaseline = 100;
      CGFloat uiBaseline = 200;
      CGFloat xincrement = self.bounds.size.width / iterations;
      for (CGFloat x1 = 0, x2 = xincrement;
           x2 &lt; self.bounds.size.width;
           x1 = x2, x2 += xincrement)
      {
          CGPathAddCurveToPoint(cgpath, NULL, x1, cgBaseline-50, x2, cgBaseline+50, x2, cgBaseline);
          [uipath addCurveToPoint:CGPointMake(x2, uiBaseline)
                    controlPoint1:CGPointMake(x1, uiBaseline-50)
                    controlPoint2:CGPointMake(x2, uiBaseline+50)];
      }
      [[UIColor blackColor] setStroke];
      CGContextAddPath(ctx, cgpath);
  
      // Stroke each path.
      [self strokeContext:ctx];
      [self strokeUIBezierPath:uipath];
  
      [uipath release];
      CGPathRelease(cgpath);
  }
  
  - (void)strokeContext:(CGContextRef)context
  {
      CGContextStrokePath(context);
  }
  
  - (void)strokeUIBezierPath:(UIBezierPath*)path
  {
      [path stroke];
  }
  </code></pre>
  
  <p>Both paths use CGContextStrokePath(), so I created separate methods to stroke each path so that I can see the time used by each path in Instruments. Below are typical results (call tree inverted); you can see that <code>-strokeContext:</code> takes 9.5 sec., while <code>-strokeUIBezierPath:</code> takes only 5 sec.:</p>
  
  <pre><code>Running (Self)      Symbol Name
  14638.0ms   88.2%               CGContextStrokePath
  9587.0ms   57.8%                 -[QuartzTestView strokeContext:]
  5051.0ms   30.4%                 -[UIBezierPath stroke]
  5051.0ms   30.4%                  -[QuartzTestView strokeUIBezierPath:]
  </code></pre>
  
  <p>It looks like UIBezierPath is somehow optimizing the path that it creates, or I'm creating the CGPath in a naïve way. What can I do to speed up my CGPath drawing?</p>