簡體   English   中英

C++ 中的執行時間差異(在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM