当前位置:编程学习 > JAVA >>

string中Insert与Format效率对比、String与List中Contains与IndexOf的效率对比

  关于string的效率,众所周知的恐怕是“+”和StringBuilder了,这些本文就不在赘述了。关于本文,请先回答以下问题(假设都是基于多次循环反复调用的情况下):
1.使用Insert与Format方法,哪个效率更高?
2.Contains(value)与IndexOf(value)谁效率更高?
 
 
假如您对此2问不感兴趣或已非常了解,请忽略此文。另外本文将不对文中代码的实际用途做任何解释。
 
 
 
<一> 首先看以下的使用场景
 
            string str1 = "abc";
            string str2 = "123";
            str1 = string.Format("{0}:{1}", str1, str2);
            str1 = str1.Insert(0, str2);
接下来开始我们的对比之旅(不包含上述代码),编写如下代码用来向控制台输出结果
 
        static void WriteTime(string title, long time)
        {
            Console.WriteLine("{1}用时:{0} ms", time, title);
        }
再添加一个方法对字符串进行循环操作
 
 
        static long LoopCalc(Action<string, string> action)
        {
            string[] array = new string[260000];            
            for (int i = 0; i < array.Length; i++)
            {
                array[i] = i.ToString();
            }
 
            Stopwatch sw = new Stopwatch();
            sw.Start();
            for (int i = 0; i < array.Length; i++)
            {
                action(array[i], "bc");
            }
 
            sw.Stop();
            return sw.ElapsedMilliseconds;
        }
 
添加对string进行Insert与Format的效率对比代码并在Main方法中调用
 
 
        static void StringPlusDemo()
        {
            long inserTime = LoopCalc((x, y) => x.Insert(0, y));
            long formatTime = LoopCalc((x, y) => string.Format("{0}{1}", y, x));
            WriteTime("Insert", inserTime);
            WriteTime("Format", formatTime);
        }
 
运行结果如下
 
明显看到Insert效率更高,但是这种结果有局限性,如果字符串很长,那么经过我亲测他们效率相差无几。
 
注:我这个只是将Format用于字符串拼接的场景,更高的效率应该仍然是StringBuilder,当然Format的其他不可替代用途太多了,Insert和StringBuilder根本无法替代它,这里就不罗嗦了。
 
 
 
<二> 依然是先看下Contains与IndexOf的使用场景
 
            string str1 = "abcd";
            string str2 = "bc";
            if (str1.Contains(str2)) { }
            if (str1.IndexOf(str2) > -1) { }
在这里仍然使用了上述的LoopCalc方法,并增加如下方法,然后在Main方法中调用其
 
 
        static void StringContainsDemo()
        {
            long indexOfTime = LoopCalc((x, y) => { if (x.IndexOf(y) >= 0) { } });
            long containersTime = LoopCalc((x, y) => { if (x.Contains(y)) { } });
            WriteTime("Contains", containersTime);
            WriteTime("IndexOf", indexOfTime);
        }
 
结果
显然Contains效率更高,为什么呢?我之前也不懂为什么,现在来看下String类的源码(关于.NET自带类库的源码可以谷歌搜到官方的下载地址,我忘了地址了),代码很多,我就贴出以下string类中的方法给各位看官
 
 
        // Determines the position within this string of the first occurence of the specified
        // string, according to the specified search criteria.  The search begins at
        // the first character of this string, it is case-sensitive and culture-sensitive, 
        // and the default culture is used.
        // 
        public int IndexOf(String value) { 
            return CultureInfo.CurrentCulture.CompareInfo.IndexOf(this,value);
        } 
 
        // Determines the position within this string of the first occurence of the specified
        // string, according to the specified search criteria.  The search begins at
        // startIndex, it is case-sensitive and culture-sensitve, and the default culture is used. 
        //
        public int IndexOf(String value, int startIndex) { 
            return CultureInfo.CurrentCulture.CompareInfo.IndexOf(this,value,startIndex); 
        }
 
        public bool Contains( string value ) {
            return ( IndexOf(value, StringComparison.Ordinal) >=0 );
        }
以下是有关Contains调用的IndexOf的重载
 
 
        public int IndexOf(String value, StringComparison comparisonType) {
            return IndexOf(value, 0, this.Length, comparisonType); 
        }
 
        public int IndexOf(String value, int startIndex, StringComparison comparisonType) {
            return IndexOf(value, startIndex, this.Length - startIndex, comparisonType); 
        }
 
        public int IndexOf(String value, int startIndex, int count, StringComparison comparisonType) { 
            // Validate inputs
            if (value == null) 
         
补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,