C# Hashtable 存储的值

lulianqi 2010-11-27 03:20:02
Hashtable里存储的 值类型只能是object吗 我能不能存储自己创建的类的值
如果只能是object 我是不是每次取完值后 都要重新装箱操作 而且我的操作十分频繁 这样对性能是不是十分不利
...全文
710 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
lulianqi 2010-12-05
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 fangxinggood 的回复:]
本来的问题是说Hashtable里的Object大量的存取是否影响性能。
但是,其实你在取出对象后,还有一部复杂的操作——GetMyPrc,而代码里本身是.net Api所提供的NextValue方法,从这一点角度出发。

Hashtable 改为 Dictionary 所带来的性能提高,和GetMyPrc相比就微乎其微了,对吧。

不如说说你使用 PerformanceCounter ……
[/Quote]
哇 你说的太好了 我就是这个意思
我想像任务管理器一样 获取每个进程的cpu占用率 所以才使用 性能计数器的 不过好像这样的查询消耗太大了 而且把pid映射到性能计数器上需要的 进程实例名 同样有十分大的消耗
开始试图使用process类 的方法属性 来实现 不过好像没有这样的方法直接得到我想要的那样的XX%的结果 不过现在我发现 process类 里有TotalProcessorTime属性 我想这个能不能通过一定的计算得到我想要的值。。。。
期待大家的回复
机器人 2010-12-04
  • 打赏
  • 举报
回复
本来的问题是说Hashtable里的Object大量的存取是否影响性能。
但是,其实你在取出对象后,还有一部复杂的操作——GetMyPrc,而代码里本身是.net Api所提供的NextValue方法,从这一点角度出发。

Hashtable 改为 Dictionary 所带来的性能提高,和GetMyPrc相比就微乎其微了,对吧。

不如说说你使用 PerformanceCounter 的目的,探讨下有没有什么别的方法可以代替它
lulianqi 2010-11-29
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 fangxinggood 的回复:]
把 GetMyPrc() 方法贴出来看看吧。没代码没真相。
[/Quote]
应您的要求贴出来了。。 大家有没有好的解决方案 教教我。。
另外 上面其他的几乎90%的性能 是消耗在 一个click 事件上 请无视 (也是自己水平有限,问题多多)
lulianqi 2010-11-29
  • 打赏
  • 举报
回复
首先说明 我在你们眼里肯定还是菜鸟 你们提意见就可以了 不要鄙视我!

namespace test4
{
class ClassTest1
{
public static PerformanceCounter allPfc = new PerformanceCounter("Process", "% Processor Time", "_Total");

public int[] myRecord=new int[50];
private PerformanceCounter myPfc = new PerformanceCounter("Process", "% Processor Time");
public ClassTest1(string myInstance)
{
for (int i = 0; i < myRecord.Length; i++)
{
myRecord[i] = 0;
}
myPfc.InstanceName = myInstance;
}

public string GetMyPrc()
{
try
{
return ((myPfc.NextValue() * 100) / allPfc.NextValue()).ToString();
}
catch
{
return ("");
}
}
}
}



class MyTool
{
public static string GetProcessInstanceName(int pid)
{
PerformanceCounterCategory cat = new PerformanceCounterCategory("Process");
string tempInst = "读取失败";
try
{
string[] instances = cat.GetInstanceNames();
foreach (string instance in instances)
{

using (PerformanceCounter cnt = new PerformanceCounter("Process", "ID Process", instance, true))
{
long val = cnt.RawValue;//RawValue得到是long类型数据!
if (val == pid)
{
tempInst = instance;
}
}
}
return tempInst;
}
catch (Exception ex)
{
return tempInst;
}
}
}


下面是性能测试报告


http://hi.csdn.net/space-4303858-do-album-picid-692562-goto-down.html我的相册地址
从上面也说明了 time中几乎所有的cpu都是消耗在GetMyPrc() 而GetMyPrc()中也是几乎只有NextValue()这个方法在消耗cpu 所有应该是使用性能计数器读取数据 本身代价太大。
lulianqi 2010-11-29
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 microtry 的回复:]
楼主,循环代码执行的时候,CPU占用高也是正常的,
不知道,实际上有什么不良影响,
一般情况建议在循环代码中加入:Application.DoEvents,
确保每循环一次,释放一次控制权给系统,免得影响其他进程,
你也可以试试看,这样能不能把所谓的CPU占用降下来
[/Quote]
可是当我发现 这30% 的占有率 几乎全部是NextValue()这个方法 给占用了 我的心里就十分的不舒畅,想换一种方式 读取。
Application.DoEvents 我好像在上次 一个线程启动时 假死时 用过。 可以的更快更新,对性能影响好像 不是很大。(我对Application.DoEvents()的理解是:是要求窗口过程处理下消息,不知道对不对)
缪军 2010-11-29
  • 打赏
  • 举报
回复
楼主,循环代码执行的时候,CPU占用高也是正常的,
不知道,实际上有什么不良影响,
一般情况建议在循环代码中加入:Application.DoEvents,
确保每循环一次,释放一次控制权给系统,免得影响其他进程,
你也可以试试看,这样能不能把所谓的CPU占用降下来
Ann725 2010-11-29
  • 打赏
  • 举报
回复
[Quote=引用楼主 lulianqi 的回复:]
Hashtable里存储的 值类型只能是object吗 我能不能存储自己创建的类的值
如果只能是object 我是不是每次取完值后 都要重新装箱操作 而且我的操作十分频繁 这样对性能是不是十分不利
[/Quote]
泛型的Dictionary字典
Dictionary<T,S>
机器人 2010-11-28
  • 打赏
  • 举报
回复
把 GetMyPrc() 方法贴出来看看吧。没代码没真相。
lulianqi 2010-11-28
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 jshi123 的回复:]
如果不是在循环里,只执行一遍是不可能看出区别来的。

看这篇文章里的测试结果,虽然作者的测试方法不一定准确,测试结果也只能代表作者的测试环境,不过大概可以看出:在一个5万个条目的Hashtable中,搜索一个条目的时间是百分之几毫秒的数量级(相对地添加一个条目的平均时间是0.几秒,大1万倍数量级),而Hashtable和Dictionary之间的性能差异也只有百分之三四十,是在同一数量级的,而……
[/Quote]
喔 我也是因此明白了 造成这样结果的,不应该是Hashtable和Dictionary 或许是可能是自己写的GetMyPrc()有问题吧! 我也不太清楚具体原因是什么 那个C#里访问性能计数器 很消耗性能吗???
jshi123 2010-11-28
  • 打赏
  • 举报
回复
如果不是在循环里,只执行一遍是不可能看出区别来的。

这篇文章里的测试结果,虽然作者的测试方法不一定准确,测试结果也只能代表作者的测试环境,不过大概可以看出:在一个5万个条目的Hashtable中,搜索一个条目的时间是百分之几毫秒的数量级(相对地添加一个条目的平均时间是0.几秒,大1万倍数量级),而Hashtable和Dictionary之间的性能差异也只有百分之三四十,是在同一数量级的,而box/unbox,cast up/cast down的时间更是只有几十纳秒的水平,
这点时间,怎么可能造成“cpu占用都有30左右”?

很显然的,GetMyPrc()这个方法才是罪魁祸首,所以不用研究Hashtable和Dictionary哪个好了,仔细看下GetMyPrc这个方法里面有什么问题吧!
lulianqi 2010-11-27
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 fangxinggood 的回复:]
引用 7 楼 lulianqi 的回复:
尝试过了 Dictionary<int, ClassTest1> myDic = new Dictionary<int, ClassTest1>();
性能的确没有提高的迹象,跟用Hashtable 然后强制转换 基本没有变化
现在我感兴趣的是 网上很多文章说 这个强制转换耗性能 而3#说“泛型是编译期而非运行期的”
到底应该怎么理解


是……
[/Quote]
就是 //myItem.SubItems[4].Text = ((ClassTest1)myHash[tempPro.Id]).GetMyPrc();

//myItem.SubItems[4].Text = myDic[tempPro.Id].GetMyPrc();
差不多卡。。 执行这个线程的时候 cpu占用都有30左右

yang406952967 2010-11-27
  • 打赏
  • 举报
回复
顶了再说
邋遢的土豆 2010-11-27
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wuyq11 的回复:]
C#的泛型特化不是在编译期,而是在运行期由JIT实现的
Dictionary 类与 Hashtable 类的功能相同。对于值类型,特定类型(不包括 Object)的 Dictionary 的性能优于 Hashtable,因为 Hashtable 的元素属于 Object 类型,所以在存储或检索值类型时通常发生装箱和取消装箱操作。
数据量非常大,应该使用SortedDictionary
htt……
[/Quote]

同意!
wuyq11 2010-11-27
  • 打赏
  • 举报
回复
C#的泛型特化不是在编译期,而是在运行期由JIT实现的
Dictionary 类与 Hashtable 类的功能相同。对于值类型,特定类型(不包括 Object)的 Dictionary 的性能优于 Hashtable,因为 Hashtable 的元素属于 Object 类型,所以在存储或检索值类型时通常发生装箱和取消装箱操作。
数据量非常大,应该使用SortedDictionary
http://www.cnblogs.com/jhh0111/archive/2008/10/24/1318223.html
机器人 2010-11-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lulianqi 的回复:]
尝试过了 Dictionary<int, ClassTest1> myDic = new Dictionary<int, ClassTest1>();
性能的确没有提高的迹象,跟用Hashtable 然后强制转换 基本没有变化
现在我感兴趣的是 网上很多文章说 这个强制转换耗性能 而3#说“泛型是编译期而非运行期的”
到底应该怎么理解
[/Quote]

是在怎样的测试的数据量的基础上得出的泛型的Dictionary和Hashtable性能差不多的结果呢?

underuwing 2010-11-27
  • 打赏
  • 举报
回复
就是在编译期间把<>里面的类型套进去了,不是在运行的时候才转换类型
lulianqi 2010-11-27
  • 打赏
  • 举报
回复
没人回下我这样的菜鸟提的问题吗。。。。
lulianqi 2010-11-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sp1234 的回复:]
引用 5 楼 lulianqi 的回复:
是不是说我即使 换成Dictionary 性能也不能提高多少


与#2楼的相比,你最起码丢了一个<>括号。先指鹿为马,当然也就无法谈论性能了。
[/Quote]
尝试过了 Dictionary<int, ClassTest1> myDic = new Dictionary<int, ClassTest1>();
性能的确没有提高的迹象,跟用Hashtable 然后强制转换 基本没有变化
现在我感兴趣的是 网上很多文章说 这个强制转换耗性能 而3#说“泛型是编译期而非运行期的”
到底应该怎么理解
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lulianqi 的回复:]
是不是说我即使 换成Dictionary 性能也不能提高多少
[/Quote]

与#2楼的相比,你最起码丢了一个<>括号。先指鹿为马,当然也就无法谈论性能了。
加载更多回复(5)

111,093

社区成员

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

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

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