3.1.31 #
解答 #
性能测试方法构造如下:
先编写一个随机字符串方法,生成一个长度大于 50 的字符串(作为未命中访问)。
然后随机生成符合要求的字符串数组,将它们全部放入符号表中。
然后遍历 10 次生成的字符串数组,对于数组中的每个元素都进行一次命中查询。
同时在每次命中查询的同时都进行一次未命中查询即可。
测试结果:
代码 #
按照要求编写代码,在 SearchCompare
类里添加一个 Random random
成员,并添加如下方法:
随机字符串发生器:
public static string GetRandomString(int minLength, int maxLength)
{
var length = Random.Next(minLength, maxLength);
var sb = new StringBuilder();
for (var i = 0; i < length; i++)
{
var choice = Random.NextDouble();
if (choice < 0.333)
sb.Append((char)Random.Next('A', 'Z'));
else if (choice < 0.666)
sb.Append((char)Random.Next('a', 'z'));
else
sb.Append((char)Random.Next('0', '9'));
}
return sb.ToString();
}
生成随机字符串数组:
public static string[] GetRandomArrayString(int n, int minLength, int maxLength)
{
var result = new string[n];
for (var i = 0; i < n; i++)
{
result[i] = GetRandomString(minLength, maxLength);
}
return result;
}
测试方法:
public static long Performance(ISt<string, int> st, int n, int averageHit)
{
var keys = GetRandomArrayString(n, 2, 50);
var keyNotExist = GetRandomString(51, 52);
var sw = Stopwatch.StartNew();
// 构建
for (var i = 0; i < n; i++)
st.Put(keys[i], i);
// 查询
for (var i = 0; i < averageHit; i++)
{
for (var j = 0; j < n; j++)
{
st.Get(keys[j]);
st.Get(keyNotExist);
}
}
sw.Stop();
return sw.ElapsedMilliseconds;
}