簡體   English   中英

c# 中的性能優化循環字符串連接

[英]Performance optimizing looped string concatenations in c#

我有一個處理一些歷史數據的應用程序。 我進行了一些性能分析,並將以下 function 確定為新的瓶頸:

public string GenerateSaveStringOptimized()
{
    StringBuilder saveString = new StringBuilder();
    saveString.Append( $"{this.TimeOfDay},{this.DayOfMonth},{this.DayOfYear},");
    foreach (float value in this.MovingAverage3h) saveString.Append($"{value},");
    foreach (float value in this.MovingAverage6h) saveString.Append($"{value},");
    foreach (float value in this.MovingAverage1d) saveString.Append($"{value},");
    foreach (float value in this.MovingAverage6d) saveString.Append($"{value},");
    foreach (float value in this.MovingAverage12d) saveString.Append($"{value},");
    foreach (float value in this.MovingAverage24d) saveString.Append($"{value},");
    foreach (float value in this.MovingAverage48d) saveString.Append($"{value},");
    foreach (float value in this.MovingAverage96d) saveString.Append($"{value},");
    foreach (float value in this.RSI3h) saveString.Append($"{value},");
    foreach (float value in this.RSI6h) saveString.Append($"{value},");
    foreach (float value in this.RSI1d) saveString.Append($"{value},");
    foreach (float value in this.RSI6d) saveString.Append($"{value},");
    foreach (float value in this.RSI12d) saveString.Append($"{value},");
    foreach (float value in this.Momentum1h) saveString.Append($"{value},");
    foreach (float value in this.SpotPrices1h) saveString.Append($"{value},");
    foreach (float value in this.BuyPrices1h) saveString.Append($"{value},");
    foreach (float value in this.SellPrices1h) saveString.Append($"{value},");
    saveString.Append($"{this.Label}");
    return saveString.ToString();
}

在此處輸入圖像描述

結果將是 csv 格式的字符串,例如:

0,1,1,0.4916667,0.4916667,0.4916667,0.4916667,0.4916667,0.49,0.49,0.49,0.49,0.4897351, [...]

每個 arrays 都包含 25 個浮點值,因此代碼類似於以下偽代碼:

for (int i = 0; i < 17; i++)
{
    for (b = 0; b < 25 b++)
    {
        saveString.Append("Value,")
    }
}

對於該函數的每次調用,都會產生 17 * 25 = 425 個字符串連接!

有沒有辦法優化它?

頂級性能消耗者似乎是“等待 cpu”和“AppendformatHelper”,這是 StringBuilder 的內置方法。 不幸的是,我知道如何輕松對待它
在此處輸入圖像描述

也許使用如下硬編碼設置?

saveString.Append($"{MA3h[0]},{MA3h[1]},{MA3h[2]},...");
saveString.Append($"{MA6h[0]},{MA6h[1]},{MA6h[2]},...");
saveString.Append($"{MA1d[0]},{MA1d[1]},{MA1d[2]},...");

通過使用以下循環取得了巨大的成功:

foreach (float value in this.RSI1d)
{
    saveString.Append(value.ToString());
    saveString.Append(',');
}

非常感謝 user1672994、Guru Stron 和 Theodor Zoulias

評論中的其他提及也將被嘗試。

預先分配足夠的容量。

StringBuilder saveString = new StringBuilder(100000);

不要使用格式化或插值。

saveString.Append(this.TimeOfDay).Append(',').Append(this.DayOfMonth).Append(',').Append(this.DayOfYear).Append(',');

在所有循環中執行類似的替換。

foreach (float value in this.MovingAverage3h) saveString.Append(value).Append(',');

不要使用格式化或插值。

saveString.Append(this.Label);

Append方法具有接受float的重載,因此不會出現裝箱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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