I'm currently sitting here considering what 'acceptable performance' is in a variety of situations, ranging from databases to user interfaces, or back end control systems.
The answer in most cases is:
It changes depending on your situation.
Even what is acceptable in a real-time environment varies dramatically, for example software designed to change the course of a cruise missile would need to respond quick enough to keep up with the rate of change of terrain, whereas something monitoring the change of temperature in a green house would likely not need to process the data faster than once every ten seconds.
A database must be atomic, as soon as you commit a transaction the data MUST exist in the database, but with concurrent connections and multiple physical CPU's this is clearly impossible without the database working sequentially - so acceptable performance in this case is "fast enough that nobody notices, but not fast enough to slow down total performance".
However, there is one exception to it being variable depending on the task: When the user is involved.
What is acceptable performance for a user interface?
Back in the days pre-DOS and PC era people likely waited the same amount of time for applications as they do today only with fewer features. (Obviously there were some exceptions, I remember waiting 5 minutes for a word processor to load, but things evened out pretty quickly since nobody WANTED to wait that long).
Firstly, there are two things to monitor to decide on performance. How fast the application is available to be told what to do and how much you can tell it to do without actually needing to wait. There are simple answers to both.
The second one is commonly ignored by a lot of bespoke software developers, and really big players who shall remain nameless - in the education sector the key piece of software in UK schools had serious problems with concurrency, and even after a full rewrite still has problems with concurrency of use of a single application - you tell it what to do and go have a cup of tea/coffee - it might be done when you get back.
This is obviously unacceptable, and companies like Microsoft who can afford to do user studies have clearly looked at the problem - for example, how long do you wait whilst you're saving in Word? How about printing?
Correct - you don't, even if it takes a while a seperate thread is doing the actual work so there is zero delay in the user interface - you can even be typing away as it saves or prints. They don't do it everywhere, but they do do it whereever the user would have to wait a varying amount depending on the data being altered.
This ensures that Word acts speedy even with a hundred megabyte document.
The question is, would anyone be willing to wait at that point to save the development work?
Whilst the answer is 'probably not' there would be a point where people wouldn't mind word freezing - would you mind a 1/2 a second on a save? How about 2 seconds?
This brings me onto the issue of actual delay before the application is usable again. What is acceptable here?
The first delay is loading the application. This is dependant on what the user wants to do, since we don't know in advance what they want to do our user interface must APPEAR to load almost instantly so that we can shave an additional second or so of time off our REAL loading time whilst the user decides what to click or press.
The second delay is the activity of doing something with the application, and can consist of one of two things from a user perspective:
- Critical continuity activities
- Non-critical activities (note - non-critical to UI flow, not anything else)
In the case of critical activies that the UI is dependant on, obviously the user must wait - unfortunate as it is, they will appreciate that it must happen. They might not be happy, but it IS going to take time to load the document they want to look at (even if just the first page is loaded for display purposes before the rest of the data is loaded). In these cases you can try as hard as possible, but you will always cause the user to wait - sometimes a nasty amount of time.
The non-critical activies are ones that do not have to occur to leave the user interface operable. Saving is a good example, so is printing and seach and replace - although this one is commonly not implemented properly. These activities should be implemented as seperate threads, with the user able to continue with their task, or do an additional slow task at the same time to avoid any actual period where the user is twiddling their thumbs.
So, in essence the only real answer to both key areas of UI performance is THE USER WANTS IT NOW unless it HAS to take longer, and then they should be allowed to do something else at the same time!
I wish developers would take the perspective of the actual end user when writing the application. We would see a lot more multi-threaded, multiple document interface applications I'm sure.
Congratulations to Microsoft for getting it right.Permalink