为什么这段代码会是一个死循环,不能结束呢??

abcdhy 2006-01-16 04:20:48
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 真的这么慢吗?!!!!!!
...全文
328 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
兔子-顾问 2006-01-17
  • 打赏
  • 举报
回复
好贴。顶
Ivony 2006-01-17
  • 打赏
  • 举报
回复
Java的资料还真是难找,找遍了Google也没找到ArrayList.romove方法……
abcdhy 2006-01-17
  • 打赏
  • 举报
回复
我已经找到原因了,是我理解错误!

在 .net 中,删除某个位置的数据应该用 RemoveAt(0)的

我试过了,修改后, .net 程序大约是 Java 程序 4 倍的性能.甚至比 Java 用数组的实现都还要快 2 倍.

看来 .net 是比 Java 快很多, Java 是得好好改良了.

要不很快就会失去现有的用户了.
abcdhy 2006-01-17
  • 打赏
  • 举报
回复
这个错误我已经修改了,谢谢!
fangsang 2006-01-17
  • 打赏
  • 举报
回复
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);
}
}
}
gxingmin 2006-01-17
  • 打赏
  • 举报
回复
list.RemoveAt(0) 和 list.Remove(0)是不一样的,前者把第一项删除,后者则找项为0的项删除,越到后来,list.Remove(0)内部的循环就越大,
整个循环相当于1000*1000*1000*1000/2倍,
我在二楼已经说了

flyinging 2006-01-16
  • 打赏
  • 举报
回复
厉害
huigll 2006-01-16
  • 打赏
  • 举报
回复
用 list.RemoveAt(0) 和 list.Remove(i); 会快得多.......
莫明其妙!
zhy0101 2006-01-16
  • 打赏
  • 举报
回复
我在循环体里打印了时间
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
Ivony 2006-01-16
  • 打赏
  • 举报
回复
呀……没看清楚……

猜想是不是因为Java的ArrayList排了序的缘故……
Ivony 2006-01-16
  • 打赏
  • 举报
回复
你有没有看你Java代码的执行结果?

.NET的泛型是真泛型,Java那是假的。

如不出我所料:
list.add(i);//这里装箱了
temp = list.get(0);//这里拆箱了。

所以,Java的那个容器里面从始至终就只有一个对象。
因为temp = list.get(0);存在拆箱。
所以你的temp++变成了毫无意义的工作,并没有对容器内的值产生任何操作。
而下面的list.remove(0);很自然的把这个值给Remove掉了。

也就是说,从始至终,那个容器里面的项个数从来没有超过1。


以上,均为信口开河,因为我没有Java环境。但是我相信对这么大一个容器进行操作不可能那么快。
你去试试看,是不是如我所言?等你的测试结果。

有Java的也帮忙测试一下……我想知道我的猜测是不是正确。
abcdhy 2006-01-16
  • 打赏
  • 举报
回复
不会吧!
在 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;
}
}
diandian82 2006-01-16
  • 打赏
  • 举报
回复
1000*1000*1;
mbh0210 2006-01-16
  • 打赏
  • 举报
回复
max 长度也不小啊,。。。。
gxingmin 2006-01-16
  • 打赏
  • 举报
回复
list.Remove(0);
list.Remove方法其实也是一个循环,它在找值等于0的项,然后删除






gxingmin 2006-01-16
  • 打赏
  • 举报
回复
不是死循环,下面这行开销大
list.Remove(0);

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧