C++ 中的执行时间差异(按引用传递和按值传递的函数之间)是否显着?
Is the execution time difference (between a function with pass by reference and pass by value) significant in C++?
对于 Leetcode 问题 1312,我实现了一个按值传递的解决方案,我的一个测试用例的执行时间超过 120 毫秒,对于相同的测试用例,在一个按引用传递的情况下,执行时间急剧减少到大约 8 毫秒,如何?
以下是两种解决方案:
120ms + 解决方案/不接受:
class Solution {
public:
vector< vector<int> > dp;
int insert(string s,int l,int r)
{
if(dp[l][r]!=-1)
return dp[l][r];
else if(l>=r)
return 0;
if(s[l]==s[r])
dp[l][r] = insert(s,l+1,r-1) ;
else
dp[l][r] = 1 + min( insert(s,l+1,r), insert(s,l,r-1) ) ;
return dp[l][r];
}
int minInsertions(string s) {
dp.resize(s.length()+1, vector<int> (s.length()+1,-1) );
return insert(s,0,s.length()-1);
}
};
~8ms解决方案:
class Solution {
public:
vector< vector<int> > dp;
int insert(string& s,int l,int r)
{
if(dp[l][r]!=-1)
return dp[l][r];
else if(l>=r)
return 0;
if(s[l]==s[r])
dp[l][r] = insert(s,l+1,r-1) ;
else
dp[l][r] = 1 + min( insert(s,l+1,r), insert(s,l,r-1) ) ;
return dp[l][r];
}
int minInsertions(string& s) {
dp.resize(s.length()+1, vector<int> (s.length()+1,-1) );
return insert(s,0,s.length()-1);
}
};
我有几个问题:
- 为什么差异如此显着?
- 它是否只发生在字符串中,我的意思是 primitive/built-in 数据类型的行为方式是否相同?
- 指针传递会导致与引用传递相同的执行吗?
- 另外,根据我对一个引用变量的理解,它指向同一个地址只是它有另一个名字,这样正确吗?
谢谢。
Is the execution time difference (between a function with pass by reference and pass by value) significant in C++?
可以很重要,也可以很不重要。这取决于。
I implemented a pass by value solution and my execution time for a testcase was above 120ms, for the same test case in a pass by reference the execution time drastically reduced to about 8ms
这个实验的结果非常清楚地证明了时间差异似乎很显着的情况 - 虽然没有关于测量方差的信息,但我们不能确定结果在统计上是否显着。
Why is the difference so significant?
您可以使用探查器找出答案。鉴于将参数更改为引用似乎显着提高了速度,可以合理猜测大部分时间都花在创建参数的多个副本上。
Does it happen only for strings
它不仅仅发生在字符串上。您会发现还有其他类型复制速度也很慢。
I mean do primitive/built-in data-types behave in the same way?
可能不会。
复制一个整数需要多少时间?整数通常是 1-8 个字节。大约需要一条指令。
复制一个字符串需要多少时间?一根绳子有多大?甚至 sizeof(std::string)
也超过了系统上最大的整数类型。然后是动态数组,其大小可能为千兆字节。复制 1 GB 比复制 8 字节花费更多的时间。即使字符串不是那么大,它的副本也可能涉及动态分配。动态分配比简单地复制一个整数要慢得多。
Would pass by pointer result in the same execution as pass by reference?
测量一下就知道了。但我可以告诉你是的。
对于 Leetcode 问题 1312,我实现了一个按值传递的解决方案,我的一个测试用例的执行时间超过 120 毫秒,对于相同的测试用例,在一个按引用传递的情况下,执行时间急剧减少到大约 8 毫秒,如何? 以下是两种解决方案:
120ms + 解决方案/不接受:
class Solution {
public:
vector< vector<int> > dp;
int insert(string s,int l,int r)
{
if(dp[l][r]!=-1)
return dp[l][r];
else if(l>=r)
return 0;
if(s[l]==s[r])
dp[l][r] = insert(s,l+1,r-1) ;
else
dp[l][r] = 1 + min( insert(s,l+1,r), insert(s,l,r-1) ) ;
return dp[l][r];
}
int minInsertions(string s) {
dp.resize(s.length()+1, vector<int> (s.length()+1,-1) );
return insert(s,0,s.length()-1);
}
};
~8ms解决方案:
class Solution {
public:
vector< vector<int> > dp;
int insert(string& s,int l,int r)
{
if(dp[l][r]!=-1)
return dp[l][r];
else if(l>=r)
return 0;
if(s[l]==s[r])
dp[l][r] = insert(s,l+1,r-1) ;
else
dp[l][r] = 1 + min( insert(s,l+1,r), insert(s,l,r-1) ) ;
return dp[l][r];
}
int minInsertions(string& s) {
dp.resize(s.length()+1, vector<int> (s.length()+1,-1) );
return insert(s,0,s.length()-1);
}
};
我有几个问题:
- 为什么差异如此显着?
- 它是否只发生在字符串中,我的意思是 primitive/built-in 数据类型的行为方式是否相同?
- 指针传递会导致与引用传递相同的执行吗?
- 另外,根据我对一个引用变量的理解,它指向同一个地址只是它有另一个名字,这样正确吗?
谢谢。
Is the execution time difference (between a function with pass by reference and pass by value) significant in C++?
可以很重要,也可以很不重要。这取决于。
I implemented a pass by value solution and my execution time for a testcase was above 120ms, for the same test case in a pass by reference the execution time drastically reduced to about 8ms
这个实验的结果非常清楚地证明了时间差异似乎很显着的情况 - 虽然没有关于测量方差的信息,但我们不能确定结果在统计上是否显着。
Why is the difference so significant?
您可以使用探查器找出答案。鉴于将参数更改为引用似乎显着提高了速度,可以合理猜测大部分时间都花在创建参数的多个副本上。
Does it happen only for strings
它不仅仅发生在字符串上。您会发现还有其他类型复制速度也很慢。
I mean do primitive/built-in data-types behave in the same way?
可能不会。
复制一个整数需要多少时间?整数通常是 1-8 个字节。大约需要一条指令。
复制一个字符串需要多少时间?一根绳子有多大?甚至 sizeof(std::string)
也超过了系统上最大的整数类型。然后是动态数组,其大小可能为千兆字节。复制 1 GB 比复制 8 字节花费更多的时间。即使字符串不是那么大,它的副本也可能涉及动态分配。动态分配比简单地复制一个整数要慢得多。
Would pass by pointer result in the same execution as pass by reference?
测量一下就知道了。但我可以告诉你是的。