std::function模板类性能问题

作者在使用匿名函数和记忆化搜索解决买卖股票问题时遇到超时,怀疑参数捕获方式影响了性能。经过尝试和对模板类的理解,推测可能是模板的动态内存分配和间接层导致的性能问题。
摘要由CSDN通过智能技术生成

背景

题目:最近发现记忆化搜索真的很好用,于是在做力扣上记忆化搜索相关的题目时,用这种方法重做了一下买卖股票问题。

问题来源

在写递归代码的时候,我学习了一种匿名函数的写法,直接在函数体内写function<int(int, int)>dfs = [&](int day, int state)->int,从而用&一个字符捕获了外部所有参数,相当的方便,省的递归一个一个手动传参数~~(上次觉得什么东西很“方便”,还是在得知#include<bits/stdc++.h>是万能头文件的时候)~~ 。

然而,用这种方法写题居然超时了。试了一个prices.length()比较长(10的5次方)的测试用例,发现执行用时居然是使用外部递归函数的几十倍(28ms->884ms),前提是两者都使用了记忆化搜索存入了数组,逻辑完全一致
在这里插入图片描述
在这里插入图片描述

怀疑是匿名参数捕获参数问题

虽然参数是引用形式捕获,还是怀疑了一下
1.改成function<int(int, int)> dfs = [&dp, &prices](int day, int state) -> int,出现问题,因为是递归,需要调用自身。

2.改成 // 先声明dfs,此时还不给它赋值
std::function<int(int, int)> dfs;
dfs = [&dp, &prices, &dfs](int day, int state) -> int
修改完,发现用时还是很久,(当然了,因为所有的参数又被捕获进来了。。。)
在这里插入图片描述

模板类

然后想起来模板这种东西似乎是需要时间的,function也属于一种template,之前没有递归调用的时候不在意模板性能,现在写了这个题,感觉还是确实有影响。本来想用visual studio的性能分析工具调试一波,谁知道测试用例太长粘都粘不过来 = =。。即使粘过来了,修改cpp的时候又会卡死。。。
综合来看,可能是模板使用过程中,动态内存分配、间接层,甚至是可能的内联展开导致了这种情况的出现。

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
std::function是一个通用的多态函数包装器,可以存储、复制和调用任何可调用的目标,包括函数、lambda表达式、绑定表达式或其他函数对象,以及指向成员函数和指向数据成员的指针。当一个std::function对象没有包装任何实际的可调用元素时,调用该对象会抛出std::bad_function_call异常。 在示例代码中,使用了std::function来包装函数calc,并通过std::bind绑定了calc的参数。通过绑定参数后,可以通过调用std::function对象来执行calc函数,并传递特定的参数。在示例中,std::function对象func绑定了calc函数的参数1、5和3,而std::function对象func1绑定了calc函数的参数1、5和占位符std::placeholders::_1,std::function对象func3绑定了calc函数的参数5和两个占位符std::placeholders::_1和std::placeholders::_2。123 #### 引用[.reference_title] - *1* [C++ function类模板](https://blog.csdn.net/weixin_38739598/article/details/112409010)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] - *2* *3* [std::function类模板](https://blog.csdn.net/m0_55875295/article/details/124679360)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值