When troubleshooting performance of SSRS reports, it can be helpful to distinguish between client-side and server-side performance issues.
Server Performance
The ReportServer database (used by SSRS for report-related storage) contains helpful execution metrics that can be used to troubleshoot server-side performance. The ExecutionLogStorage table, for example, contains TimeDataRetrieval, TimeProcessing, TimeRendering, Status, ByteCount, and RowCount fields. These can indicate if an issue has to do with a SQL query (TimeDataRetrieval) or report rendering problems (TimeRendering), for example.
A useful query against the ExecutionLogStorage table is:
select top 1000 c.Name, [LogEntryId], [InstanceName], [ReportID], [UserName], [ExecutionId], [RequestType], [Format],
[Parameters], [ReportAction], [TimeStart], [TimeEnd], [TimeDataRetrieval], [TimeProcessing], [TimeRendering],
[Source], [Status], [ByteCount], [RowCount], [AdditionalInfo]
from [dbo].[ExecutionLogStorage] l
join dbo.[Catalog] c
on l.ReportID = c.ItemID
where l.TimeStart > '2015-09-01 09:15:06.103'
order by l.TimeStart
Client Performance
If the server is performing well, but a user is still seeing performance problems, a helpful property to check is InteractiveSize on the Report object. This value indicates how much data is returned to the user per page of a report. By decreasing this value, we can return less bytes per page and possibly ameliorate situations where a client browser is getting flooded with data.