I haven't done enough testing, though, to be certain that there is a genuine pattern here as opposed to mere variance. But I am trying to tweak my cards for submission rate rather than just trying to max out my hash rate.
Your best bet is to average it over a very long period of time (3 hours and up) and graph it. Graphing it will show fluctuations very easily, so you can eyeball what your average is, and the standard deviation. You can do this by logging the output of your client to a text file, which, depending on your mining software, should output timestamps, accepted shares, and rejected shares. From there you can filter out everything except the lines with accepted or rejected shares, parse it into a spreadsheet, and use your spreadsheet to generate a graph. I would
include rejected shares in the estimated hashrate calculations, because they are still work performed by your miner. You can look at them on a separate graph to determine if certain configurations are giving you higher rejection rates.
If you don't know the math, simply determine how long you ran your miner for and count up the number of shares (both accepted and rejected) and:
Estimated Hashrate in MHash/s = Total # of Shares * 4294.97 / Time in Seconds
To make a graph you'd have to do a moving average type calculation.
If you are overclocking your card or trying experimental kernels, and you are concerned that your graphics card is making mistakes, I know that at least poclbm verifies shares produced by the GPU prior to submitting them to the pool, and will report an error if it finds one. So, with logging to a file you can easily search for "Verification failed, check hardware!" to see how many times your GPU made a mistake.