首页 新闻 会员 周边 捐助

为什么virtual关键字很耗时间

0
悬赏园豆:5 [已解决问题] 解决于 2017-05-06 17:30

同一个方法,加了virtual,通过父类去调用这个方法,和不加virtual调用,会占用更多时间?

方法:

  /// <summary>
        /// 针对病种库或实验组的病例检索
        /// </summary>
        public Virtual  SearchResultViewModel SearchCaseView(int? groupId, int? sdId, string viewId, bool isAdv, string filterTree, string filterParas, string sysParamLoginUser, bool forAddingCase = false, bool forExport = false)
        { 

            var searchResultReturn =   _caseService.SearchCases(groupId, sdId, viewId, isAdv, filterTree, filterParas, sysParamLoginUser, forAddingCase, forExport);

            var result = new SearchResultViewModel(searchResultReturn.Model, searchResultReturn.IsSuccessful, searchResultReturn.FailureReason);
            result.GroupInMaxNum = searchResultReturn.GroupInMaxNum;
            result.operlogStr = searchResultReturn.operlogStr;

          
            return result;
        }

调用:

 
 public ActionResult SearchCasesBySD(int sdid, string viewId, bool isAdv, string filterTree, string filterParas)
        {

  System.Diagnostics.Stopwatch logwatch = new System.Diagnostics.Stopwatch();
            logwatch.Start();
  var caseList = _service.SearchCaseView(null, sdid, viewId, isAdv, filterTree, filterParas, AuthenticatedUserName);
            logwatch.Stop();
                caseList.operlogStr += (string.Format("--Action调用SearchCaseView,isAdv,{0},总耗时{1}毫秒,viewId,{2},结束时间{3} --\r\n", isAdv, logwatch.ElapsedMilliseconds, viewId, System.DateTime.Now.ToString()));

      }

方法 SearchCaseView加不加virtual关键词 所耗得时间相差 100毫秒左右。为什么?

王庆东mas的主页 王庆东mas | 初学一级 | 园豆:4
提问于:2017-05-04 15:06
< >
分享
最佳答案
1

不加virtual则此方法时静态绑定的,加了virtual则Wie运行时动态绑定。

动态绑定的过程一般就是虚拟机提取(调用此方法的)对象的(运行时)实际类型的虚方法表,并通过签名等特征搜索方法,找到方法后调用方法。这个过程需要消耗性能。

收获园豆:2
西漠以西 | 小虾三级 |园豆:1675 | 2017-05-04 16:11
其他回答(2)
2

100毫秒太夸张了,确认下你不是冷启动后的第一次运行。性能上的确会欠缺点,但这个性能上的差异基本是可以忽略的。

收获园豆:2
Daniel Cai | 园豆:10424 (专家六级) | 2017-05-04 17:12

bushi

支持(0) 反对(0) 王庆东mas | 园豆:4 (初学一级) | 2017-05-04 17:25

@王庆东mas: 你这里要测这个玩意的话建议你把所有干扰项排除掉,比如那个service的调用,mock掉或者写死返回值。

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2017-05-04 18:06
0

按楼上说的做就可以,serach那行写成死数据再去单纯测virtual。你说的100ms误差应该是搜索导致的。

收获园豆:1
ぁ丶泛滥的尐青春つ | 园豆:199 (初学一级) | 2017-05-06 16:09
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册