using System;
using System.Collections;
using System.Collections.Generic;namespace DefaultNamespace
{
public class ListTest
{
static public void Main(String[] args) {
int max = 1000*1000*1;
List<Int32> list = new List<Int32>();

DateTime st = DateTime.Now;
int temp = 0;
for (int i = 0; i < max; i++) {
list.Add(i);
temp = list[0];
temp++;
list.Remove(0);
}
Console.WriteLine(DateTime.Now.Ticks - st.Ticks);
}
}
}
初学 .net 2.0  ,写了以上的代码,居然在我的机器(P4 3.0G + 512M 内存)上,使用 .net 2.0 执行上面编译出来的代码, 居然执行了 5分钟还不结束,是我的程序有问题??
还是 .net 真的这么慢吗?!!!!!!

解决方案 »

  1.   

    不是死循环,下面这行开销大
    list.Remove(0);
      

  2.   

    list.Remove(0); 
    list.Remove方法其实也是一个循环,它在找值等于0的项,然后删除
      

  3.   

    不会吧!
    在 Java 里,类似的代码(存入一个数据,再取出这个数据,最后删除这个数据):
    但 int max = 1000*1000*1000; 
    看到了吗? 是 1000*1000*1000 一共 10亿 次操作哦!在我的机器上大约只需要 70秒 就执行完毕.难道 .net 这么慢吗??  整整少了 1000 倍, 还 5分钟都不能结束.*************附Java的代码,大家可以试试**************
    package util;
    import java.util.*;
    public class ArrayListTest {
    public static void main(String[] args) {
    int max = 1000*1000*1000;
    ArrayList<Integer> list = new ArrayList<Integer>(10);
    int temp = 0;

    st = new SimpleTimer().start();
    for (int i = 0; i < max; i++) {
    list.add(i);
    temp = list.get(0);
    temp++;
    list.remove(0);
    }
    long t = st.end();

    System.out.println("ArrayList<Integer>共用时间(毫秒): "+t);
    }
    }
    ********SimpleTimer类**************
    package util;
    public class SimpleTimer {
    long startTime = 0;
    public SimpleTimer start() {
    startTime = System.currentTimeMillis();
    return this;
    }
    public long end() {
    return System.currentTimeMillis() - startTime;
    }
    }
      

  4.   

    你有没有看你Java代码的执行结果?.NET的泛型是真泛型,Java那是假的。如不出我所料:
    list.add(i);//这里装箱了
    temp = list.get(0);//这里拆箱了。所以,Java的那个容器里面从始至终就只有一个对象。
    因为temp = list.get(0);存在拆箱。
    所以你的temp++变成了毫无意义的工作,并没有对容器内的值产生任何操作。
    而下面的list.remove(0);很自然的把这个值给Remove掉了。也就是说,从始至终,那个容器里面的项个数从来没有超过1。
    以上,均为信口开河,因为我没有Java环境。但是我相信对这么大一个容器进行操作不可能那么快。
    你去试试看,是不是如我所言?等你的测试结果。有Java的也帮忙测试一下……我想知道我的猜测是不是正确。
      

  5.   

    呀……没看清楚……猜想是不是因为Java的ArrayList排了序的缘故……
      

  6.   

    我在循环体里打印了时间
                    DateTime st = DateTime.Now;
                    list.Add(i);
                    temp = list[0];
                    temp++;
                    list.Remove(0);
                    Console.WriteLine(DateTime.Now.Ticks - st.Ticks);
    结果每24次循环出现一次156250,其余为0
    P4 2.4B,512M
      

  7.   

    用 list.RemoveAt(0) 和 list.Remove(i); 会快得多.......
    莫明其妙!
      

  8.   

    我已经找到原因了,是我理解错误!在 .net 中,删除某个位置的数据应该用 RemoveAt(0)的我试过了,修改后,  .net 程序大约是 Java 程序 4 倍的性能.甚至比 Java 用数组的实现都还要快 2 倍.看来 .net 是比 Java 快很多, Java 是得好好改良了.要不很快就会失去现有的用户了.
      

  9.   

    Java的资料还真是难找,找遍了Google也没找到ArrayList.romove方法……
      

  10.   

    list.RemoveAt(0) 和 list.Remove(0)是不一样的,前者把第一项删除,后者则找项为0的项删除,越到后来,list.Remove(0)内部的循环就越大,
    整个循环相当于1000*1000*1000*1000/2倍,
    我在二楼已经说了
      

  11.   

    abcdhy(程旭) :
    你有没搞错啊?java中的list.remove(0)是删除list的第0个,这样的list中最后是空的
    你应该修改c#程序为
    using System;
    using System.Collections;
    using System.Collections.Generic;namespace DefaultNamespace
    {
    public class ListTest
    {
    static public void Main(String[] args) {
    int max = 1000*1000*1;
    List<Int32> list = new List<Int32>();DateTime st = DateTime.Now;
    int temp = 0;
    for (int i = 0; i < max; i++) {
    list.Add(i);
    temp = list[0];
    temp++;
    list.RemoveAt(0);
    }
    Console.WriteLine(DateTime.Now.Ticks - st.Ticks);
    }
    }
    }