![](/img/trans.png)
[英]C++ is there a difference between assignment inside a pass by value and pass by reference function?
[英]Is the execution time difference (between a function with pass by reference and pass by value) significant in C++?
對於 Leetcode 問題 1312,我實現了 pass by value 解決方案,並且我的測試用例的執行時間在 120ms 以上,對於通過引用傳遞的相同測試用例,執行時間大幅減少到大約 8ms,如何? 以下是兩種解決方案:
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);
}
};
我有一些問題:
謝謝你。
C++ 中的執行時間差異(在 function 與按引用傳遞和按值傳遞之間)是否顯着?
它可以很重要,也可以微不足道。 這取決於。
我實現了按值傳遞解決方案,我的測試用例執行時間超過 120 毫秒,對於按引用傳遞的相同測試用例,執行時間大幅減少到約 8 毫秒
該實驗的結果非常清楚地表明了時間差似乎很顯着的情況——盡管沒有關於測量方差的信息,我們不能確定結果在統計上是顯着的。
為什么差異如此顯着?
您可以使用探查器進行查找。 鑒於將參數更改為引用似乎顯着提高了速度,因此可以合理地猜測大部分時間都花在了創建參數的多個副本上。
它只發生在字符串上嗎
它不僅僅發生在字符串上。 您會發現還有其他類型的復制速度也很慢。
我的意思是原始/內置數據類型的行為方式是否相同?
可能不是。
復制一個 integer 需要多少時間? 整數通常是 1-8 個字節。 它需要大約一條指令。
復制一個字符串需要多少時間? 一根繩子到底有多大? 甚至sizeof(std::string)
也超過系統上最大的 integer 類型。 然后是動態數組,它的大小可能是千兆字節。 復制 1 GB 比復制 8 個字節需要更多時間。 即使字符串不是那么大,它的副本也可能涉及動態分配。 動態分配比簡單地復制 integer 慢得多。
按指針傳遞會導致與按引用傳遞相同的執行嗎?
你可以通過測量來發現。 但我可以告訴你,是的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.