An interesting issue was raised [in comments](https://mathematica.stackexchange.com/questions/174682/monitoring-plot3d-with-a-given-number-of-plotpoints#comment458586_174682) to the following question: [Monitoring Plot3D with a given number of plotpoints](https://mathematica.stackexchange.com/q/174682/27951).

We were discussing the fact that a `Plot3D` expression with options `PlotPoints -> points` and `MaxRecursion -> 0` evaluated the function to be plotted $4 \ \textrm{points}^2$, instead of simply $\textrm{points}^2$ times as I would have expected from the documentation. In fact, the [docs for `PlotPoints`](http://reference.wolfram.com/language/ref/PlotPoints.html) state that, with more than one variable, `PlotPoints -> n` specifies that $n$ initial points should be used in each direction. That, together with the `MaxRecursion -> 0` should stop any attempts at further refinement. 

Searching this site, I learned that the **extra evaluations are used to calculate the "vertex normals"** (see [Why does Plot3D appear to traverse the points twice?](https://mathematica.stackexchange.com/q/163624/27951) and Henrik's answer there). This can be turned off using `NormalsFunction -> None`.

At first, however, I did not know about `NormalsFunction` and its effect, so I was playing around with a toy example, and I noticed a pattern in the function evaluations within `Plot3D` that had me scratching my head. I time-stamped each function evaluation and kept track of how many there were, as a ratio to `points^2`, which was my expected number of evaluations:

    points = 100;
    
    timing =
      Module[
        {i, start, results},
        i = 0;
        start = TimeObject[Now];
        results =
          Reap@
           Plot3D[
             1, {x, -2, 2}, {y, -2, 2},
             PlotPoints -> points, MaxRecursion -> 0,
             EvaluationMonitor :> Sow[{TimeObject[Now], i++/points^2}]
           ];
        {#1 - start, #2}& @@@ results[[2, 1]]
      ];

Requesting $100 \times 100 = 10,000$ points is perhaps uncommon, but it is not outside of the realm of possibilities, and it highlights the issue nicely.

I also generated a `timingNoNormals` by adding `NormalsFunction -> None` to the above code, keeping everything else identical. Here are the results, presented graphically:

    ListLinePlot[
      {timing, timingNoNormals},
      Frame -> True, Axes -> False, AspectRatio -> 1, FrameStyle -> Black,
      FrameLabel -> {"time since start (seconds)", "number of evaluation / points^2"},
      PlotLegends -> {"regular Plot3D", "with NormalsFunction -> None"},
    ]

![comparison](https://i.sstatic.net/L0PS4.png)

Two features here were surprising to me, which lead to my questions:

 - I was surprised to find that a good 3/4 of the evaluation time in `Plot3D` seems to be taken up by calculation of the vertex normals. This can use up quite a bit of time for even moderately costly function. **When can we safely turn this "feature" off using** `NormalsFunction -> None`**? Would it be safe to make that option persistent?**

 - Additionally, the delay between the first batch of function evaluations and the second, corresponding to that plateau in the blue plot above, was surprising to me. **What is Plot3D doing in between?** Building a `Graphics3D` object?