好 - 時間爲新的真相!
這是對字符串中任何大寫字母的測試。
該字符串保證在第一個60K字符內沒有任何大寫字符。 (我從random.org創建的字符串)
我通過隨機化將64K字符串傳遞給測試函數來防止編譯器中的字符串替換優化。
所有的時間都非常嚴格地圍繞實際測試,並且不包括函數調用時間。
我跑了測試一次,10次,並再次10000次,並平均每組測試的時間。
我跑在64位的測試運7與i3-2100 CPU @ 3.1千兆赫
試驗例1:
static bool testCaseOne(string str, out double ms)
{
bool result = false;
DateTime start = DateTime.Now;
result = !string.IsNullOrEmpty(str) && str.Any(c => char.IsUpper(c));
ms = (DateTime.Now - start).TotalMilliseconds;
return result;
}
得到的平均時間:
- 1 X = 3.000 ms
- 10 x = 0.860 ms
- 10,000 x = 0。821毫秒
試驗例2:
static bool testCaseTwo(string str, out double ms)
{
bool result = false;
DateTime start = DateTime.Now;
if (string.IsNullOrEmpty(str))
{
ms = 0;
return false;
}
result = Regex.IsMatch(str, "[A-Z]");
ms = (DateTime.Now - start).TotalMilliseconds;
return result;
}
得到的平均時間:
- 1×= 2.000毫秒
- 10×= 1.597毫秒
- 10,000×= 1.603毫秒
試驗例3:
static bool testCaseThree(string str, out double ms)
{
bool result = false;
DateTime start = DateTime.Now;
if (string.IsNullOrEmpty(str))
{
ms = 0;
return false;
}
for (int i = 0; i < str.Length; i++)
{
if (char.IsUpper(str[i]))
{
result = true;
break;
}
}
ms = (DateTime.Now - start).TotalMilliseconds;
return result;
}
得到的平均時間:
- 1×= 1.000毫秒
- 10×= 0.357毫秒
- 10,000×= 0.298毫秒
測試案例4:
static bool testCaseFour(string str, out double ms)
{
bool result = false;
DateTime start = DateTime.Now;
if (string.IsNullOrEmpty(str))
{
ms = 0;
return false;
}
for (int i = 0; i < str.Length; i++)
{
if (str[i] > 64 && str[i] < 91)
{
result = true;
break;
}
}
ms = (DateTime.Now - start).TotalMilliseconds;
return result;
}
}
得到的平均時間:
- 1×= 0.000毫秒
- 10×= 0.137毫秒
- 10,000×= 0.184毫秒
有趣。
我希望這statisfies RK先生;)
我會考慮這個「足夠快」。 – BoltClock 2011-06-01 01:19:21
我認爲這是一個好方法,你可以使用LINQ來完成for循環的工作,但生成的代碼將是等效的。您還可以測試原始字符串是否與轉換爲小寫字符串的字符串不相同,但是我期望該字符串的性能較差,因爲它始終需要全部遍歷字符串。 – Clayton 2011-06-01 01:23:58
使用LINQ代替for循環可能會出現一些性能問題 – VisualBean 2013-10-08 12:40:18