我不認爲你需要在所有Concat的 - 定的測試數據。以字節數組爲單位,反轉它們,然後通過一個BitConverter.ToString調用!
class Program
{
static int ITERATIONS = 100000;
static void Main(string[] args)
{
var pass_packet = Enumerable.Range(0, 1024).Select(i => (byte)i).ToArray();
int local_index = 5;
var sw = Stopwatch.StartNew();
var result = StringBuilderTEST(pass_packet, local_index);
Console.WriteLine(result + " in {0}ms", sw.ElapsedMilliseconds);
//second option
sw.Restart();
var result2 = ArrayReversalTEST(pass_packet, local_index);
Console.WriteLine(result2 + " in {0}ms", sw.ElapsedMilliseconds);
sw.Restart();
var result3 = ArrayReversal2TEST(pass_packet, local_index);
Console.WriteLine(result3 + " in {0}ms", sw.ElapsedMilliseconds);
sw.Restart();
var result4 = StupidlyFastTEST(pass_packet, local_index);
Console.WriteLine(result4 + " in {0}ms", sw.ElapsedMilliseconds);
Console.WriteLine("Results are equal? " + (result == result2 && result == result3 && result == result4));
Console.ReadLine();
}
private static string StringBuilderTEST(byte[] pass_packet, int local_index)
{
string result = null;
for (int b = 0; b < ITERATIONS; b++)
{
var sb = new StringBuilder();
for (int i = 511; i >= 400; i--)
sb.Append(BitConverter.ToString(pass_packet, local_index + i, 1));
result = sb.ToString();
}
return result;
}
private static string ArrayReversalTEST(byte[] pass_packet, int local_index)
{
string result = null;
for (int b = 0; b < ITERATIONS; b++)
{
var selectedData = pass_packet.Skip(400 + local_index).Take(112).Reverse().ToArray();
result = BitConverter.ToString(selectedData).Replace("-", "");
}
return result;
}
private static string ArrayReversal2TEST(byte[] pass_packet, int local_index)
{
string result = null;
for (int b = 0; b < ITERATIONS; b++)
{
var tempArray = new byte[112];
Array.Copy(pass_packet, 400 + local_index, tempArray, 0, 112);
Array.Reverse(tempArray);
result = BitConverter.ToString(tempArray).Replace("-", "");
}
return result;
}
private static string StupidlyFastTEST(byte[] pass_packet, int local_index)
{
string result = null;
string hex = "ABCDEF";
for (int it = 0; it < ITERATIONS; it++)
{
var tempArray = new char[112 * 2];
int tempArrayIndex = 0;
for (int i = 511; i >= 400; i--)
{
var b = pass_packet[local_index + i];
tempArray[tempArrayIndex++] = hex[b >> 4];
tempArray[tempArrayIndex++] = hex[b & 0x0F];
}
result = new string(tempArray);
}
return result;
}
}
結果:
Test 1 in 478ms
Test 2 in 1134ms
Test 3 in 516ms
Test 4 in 114ms
Results are equal? True
正如你可以重寫代碼中看到我的頭兩個嘗試不是很有效 - 尤其是考慮創建和維護所需要的額外的時間。然而,一些快速測試顯示,這是由於String.Replace需要使結果相同 - 因爲默認轉換器在數組中的每個字節對之間放置了' - ',原始算法由於單字節長度而沒有看到。
//Without String.Replace in tests 2 and 3
Test 1 in 475ms
Test 2 in 704ms
Test 3 in 92ms
Test 4 in 115ms
Results are equal? False
正如你可以在原始性能方面看Test3的是最快的 - 雖然默認的輸出包含「 - 」每一個字節之間。
Test4用快速手動版本取代了轉換器 - 省去了字節分隔符 - 並且是原始結果中速度最快的。我懷疑高速緩存臨時數組,並用一個更大的256元素十六進制數組替換
分部&模數學公式
*將顯着提高速度,但考慮到這一點證明將停止在這裏。
*編輯,用位操作代替分割和模數以顯着加速。
使用StringBuilder效率.. – Naren
可能重複的[我應該如何連接字符串?](http://stackoverflow.com/questions/3102806/how-should-i-concatenate-strings) – wudzik
什麼是'pass_packet' ,你究竟想要做什麼?它看起來像你有效地試圖獲得負載的字節*以相反的順序*,表示爲十六進制...這是一個相當不尋常的要求。那絕對是你想要做的? –