You should drill down inside those 3 seconds in order to determine where are exactly they lost. There are lots of things happening here:
- You are building this
reportData
variable from somewhere - measure how long it takes
- You are serializing this
reportData
variable into JSON - measure how long it takes
Once you have those measurements you will know where you need/can optimize. If it turns out that 2.9s out of 3s are lost in 1. then you definitely should improve the way you are querying your data or maybe optimize your data store (pretty hard and subjective thing to talk about assuming the information you provided so far). Maybe you just forgot to add an index to some column in your SQL database - who knows.
If on the other hand it turns out that your bottleneck is 2. then you definitely have a HUGE design problem. Usually the serialization is not an issue unless you are doing something very wrong, like trying to serialize enormous amounts of data that nobody ever needs or a human being can consume. In this case of course you should be talking to the UI guys that invented the screens you are implementing and explain to them that it hardly makes sense to display 1 million points on a screen with resolution 1024x768 (just an example) and then of course improve your query so that your view model is not that insanely huge.
So bottom line is that you should be narrowing down where this time is lost (using a profiler is a very good start, I would recommend you Telerik's JustTrace) so that you know exactly where you need to improve.