Both the stored proc and the query thru ssrs will get parameterized, so they should be cached the same way although they will be 2 different caches. If I were you I would start with examining the execution log on the report server database to find where your issue is coming from.
Here is a script that will show you the times its requiring to get the data, process, and render.
select
reverse ( substring ( reverse ( el . ReportPath ), 1 , charindex ( '/' , reverse ( el . ReportPath ))- 1 )) as ReportName
, u . UserName as LastModBy
, coalesce ( cast ( el . parameters as varchar ( max )), '' ) as [Parameters]
,( select count (*) from executionlog2 tmp where tmp . reportpath = el . reportpath and tmp . username = el . username and tmp . reportaction = 'Render' and tmp . status = 'rsSuccess' group by tmp . ReportPath ) as UserCount60Day
, el . Format
, el . UserName
, el . ReportAction
, el . Status
, el .Source
, el . [RowCount]
, el . ExecutionId
, el . TimeDataRetrieval / 1000 as DataRetrieval
, el . TimeProcessing / 1000 as Processing
, el . TimeRendering / 1000 as Rendering
,( el . TimeProcessing + el . TimeRendering ) / 1000 as ProcessAndRender
, el . AdditionalInfo
, case
when datediff ( ss , el . TimeStart , el . TimeEnd ) >= 30
then 1
else 2
end as DisplayInRed
from
ExecutionLog2 el
join ReportServer . dbo . Catalog c
on c . Path = el . ReportPath
join ReportServer . dbo . Users u
on u . UserId = c . ModifiedByID
where
el . ReportAction = 'Render'
Also keep profiler running while you execute the report so you can see whats going on behind the scenes.
Hope it helps.