各位看官,,我不是在引发战争,,我只是想知道事情的真想,我源之于,一段代码我需要实现C#和java的两个版本功能,才发现这一个对比。讨论问题的实质,为什么会出现这样的问题。java和C#都很优秀。请大家不要偏激了。

今天,因为工作问题,测试了一下C#和java同意的代码功能执行情况,发现一个问题。

HashSet.contains 方法对比,在java下面性能居然没有c#的高。

     private static final Logger log = Logger.getLogger(NewClass.class);

     public static void main(String[] args) {
         for (int j = 0; j < 5; j++) {
             HashSet<Integer> ids = new HashSet<>(0);
             log.error("开始测试:" + j);
             int forCount = 200 * 10000;
             for (int i = 0; i < forCount; i++) {
                 if (!ids.contains(i)) {
                     ids.add(i);
                 }
             }
             log.error("结束测试:" + j + " 执行次数:" + forCount);
         }
     }

[04-12 16:16:57:427] -> 开始测试:0
[04-12 16:16:58:063] -> 结束测试:0 执行次数:2000000
[04-12 16:16:58:064] -> 开始测试:1
[04-12 16:16:58:835] -> 结束测试:1 执行次数:2000000
[04-12 16:16:58:835] -> 开始测试:2
[04-12 16:16:58:993] -> 结束测试:2 执行次数:2000000
[04-12 16:16:58:994] -> 开始测试:3
[04-12 16:16:59:247] -> 结束测试:3 执行次数:2000000
[04-12 16:16:59:249] -> 开始测试:4
[04-12 16:16:59:382] -> 结束测试:4 执行次数:2000000

看出java运行结果 执行200万次检索插入,执行时间100多毫秒,大约是。

     private static final Logger log = Logger.getLogger(NewClass.class);

     public static void main(String[] args) {
         for (int j = 0; j < 5; j++) {
             HashSet<Integer> ids = new HashSet<>(0);
             log.error("开始测试:" + j);
             int forCount = 2000 * 10000;
             for (int i = 0; i < forCount; i++) {
                 if (!ids.contains(i)) {
                     ids.add(i);
                 }
             }
             log.error("结束测试:" + j + " 执行次数:" + forCount);
         }
     }

[04-12 16:18:09:345] -> 开始测试:0
[04-12 16:18:24:835] -> 结束测试:0 执行次数:20000000
[04-12 16:18:24:836] -> 开始测试:1
[04-12 16:18:36:600] -> 结束测试:1 执行次数:20000000
[04-12 16:18:36:600] -> 开始测试:2
[04-12 16:18:44:331] -> 结束测试:2 执行次数:20000000
[04-12 16:18:44:331] -> 开始测试:3
[04-12 16:18:51:801] -> 结束测试:3 执行次数:20000000
[04-12 16:18:51:803] -> 开始测试:4
[04-12 16:19:01:277] -> 结束测试:4 执行次数:20000000

而执行2000完成检索插入的时候执行平均时间 大约是9秒左右

接下来我们看看c#的运行结果

     static void Main(string[] args)
         {
             ; j < ; j++)
             {
                 HashSet<int> ids = new HashSet<int>();
                 Console.WriteLine(DateTime.Now.NowString() + "开始测试:" + j);
                  * ;
                 ; i < forCount; i++)
                 {
                     if (!ids.Contains(i))
                     {
                         ids.Add(i);
                     }
                 }
                 Console.WriteLine(DateTime.Now.NowString() + "结束测试:" + j + " 执行次数:" + forCount);
             }
             Console.ReadLine();
         }

2015-04-12 16:20:06:223:开始测试:0
2015-04-12 16:20:06:321:结束测试:0 执行次数:2000000
2015-04-12 16:20:06:322:开始测试:1
2015-04-12 16:20:06:413:结束测试:1 执行次数:2000000
2015-04-12 16:20:06:414:开始测试:2
2015-04-12 16:20:06:500:结束测试:2 执行次数:2000000
2015-04-12 16:20:06:500:开始测试:3
2015-04-12 16:20:06:616:结束测试:3 执行次数:2000000
2015-04-12 16:20:06:617:开始测试:4
2015-04-12 16:20:06:717:结束测试:4 执行次数:2000000

执行200万次检索插入,执行平均时间100毫秒左右,比java略胜一凑

再看看2000万次的检索插入情况

         static void Main(string[] args)
         {
             ; j < ; j++)
             {
                 HashSet<int> ids = new HashSet<int>();
                 Console.WriteLine(DateTime.Now.NowString() + "开始测试:" + j);
                  * ;
                 ; i < forCount; i++)
                 {
                     if (!ids.Contains(i))
                     {
                         ids.Add(i);
                     }
                 }
                 Console.WriteLine(DateTime.Now.NowString() + "结束测试:" + j + " 执行次数:" + forCount);
             }
             Console.ReadLine();
         }

2015-04-12 16:20:51:746:开始测试:0
2015-04-12 16:20:52:633:结束测试:0 执行次数:20000000
2015-04-12 16:20:52:634:开始测试:1
2015-04-12 16:20:53:645:结束测试:1 执行次数:20000000
2015-04-12 16:20:53:645:开始测试:2
2015-04-12 16:20:54:615:结束测试:2 执行次数:20000000
2015-04-12 16:20:54:615:开始测试:3
2015-04-12 16:20:55:623:结束测试:3 执行次数:20000000
2015-04-12 16:20:55:624:开始测试:4
2015-04-12 16:20:56:561:结束测试:4 执行次数:20000000

看看2000万次的检索插入时间大约是1秒钟样子。

这个不晓得是不是量级的性能问题呢????

接下来再看看,直接插入,。,因为插入也自带了检索条件的

    private static final Logger log = Logger.getLogger(NewClass.class);

     public static void main(String[] args) {
         for (int j = 0; j < 5; j++) {
             HashSet<Integer> ids = new HashSet<>(0);
             log.error("开始测试:" + j);
             int forCount = 2000 * 10000;
             for (int i = 0; i < forCount; i++) {
                 ids.add(i);
             }
             log.error("结束测试:" + j + " 执行次数:" + forCount);
         }
     }

[04-12 16:30:32:591] -> 开始测试:0
[04-12 16:30:44:725] -> 结束测试:0 执行次数:20000000
[04-12 16:30:44:726] -> 开始测试:1
[04-12 16:30:57:535] -> 结束测试:1 执行次数:20000000
[04-12 16:30:57:536] -> 开始测试:2
[04-12 16:31:08:237] -> 结束测试:2 执行次数:20000000
[04-12 16:31:08:237] -> 开始测试:3
[04-12 16:31:19:306] -> 结束测试:3 执行次数:20000000
[04-12 16:31:19:309] -> 开始测试:4
[04-12 16:31:23:810] -> 结束测试:4 执行次数:20000000

单纯插入java执行2000万次的时间大约是9秒多,

   static void Main(string[] args)
         {
             ; j < ; j++)
             {
                 HashSet<int> ids = new HashSet<int>();
                 Console.WriteLine(DateTime.Now.NowString() + "开始测试:" + j);
                  * ;
                 ; i < forCount; i++)
                 {
                         ids.Add(i);
                 }
                 Console.WriteLine(DateTime.Now.NowString() + "结束测试:" + j + " 执行次数:" + forCount);
             }
             Console.ReadLine();
         }

2015-04-12 16:32:35:355:开始测试:0
2015-04-12 16:32:36:064:结束测试:0 执行次数:20000000
2015-04-12 16:32:36:065:开始测试:1
2015-04-12 16:32:36:879:结束测试:1 执行次数:20000000
2015-04-12 16:32:36:879:开始测试:2
2015-04-12 16:32:37:657:结束测试:2 执行次数:20000000
2015-04-12 16:32:37:657:开始测试:3
2015-04-12 16:32:38:466:结束测试:3 执行次数:20000000
2015-04-12 16:32:38:467:开始测试:4
2015-04-12 16:32:39:238:结束测试:4 执行次数:20000000

c# 2000万次插入执行时间大约是1秒不到。,,是不是很有趣。。。

不知道是不是我电脑问题,还是我的执行情况不对。各位看官提出建议看看。。。

======================================================================

这里是应各位看官要求,改成string的方式,同样是用guid的生成方式,保证完全代码一模一样

  static void Main(string[] args)
         {
             Console.ReadLine();
             ; j < ; j++)
             {
                 serverID = j;
                 id = ;
                 HashSet<String> ids = new HashSet<String>();
                 Console.WriteLine(DateTime.Now.NowString() + "开始测试:" + j);
                  * ;
                 ; i < forCount; i++)
                 {
                     //long tempID = getId();
                     String tempID = Guid.NewGuid().ToString();
                     bool add = ids.Add(tempID);
                     if (!add)
                     {
                         Console.WriteLine(DateTime.Now.NowString() + "重复:" + i + "  " + tempID);
                     }
                 }
                 Console.WriteLine(DateTime.Now.NowString() + "结束测试:" + j + " 执行次数:" + forCount);
             }
             Console.ReadLine();
         }

2015-04-12 18:17:19:501:开始测试:0
2015-04-12 18:17:29:757:结束测试:0 执行次数:6000000
2015-04-12 18:17:29:757:开始测试:1
2015-04-12 18:17:39:582:结束测试:1 执行次数:6000000
2015-04-12 18:17:39:583:开始测试:2
2015-04-12 18:17:48:141:结束测试:2 执行次数:6000000
2015-04-12 18:17:48:141:开始测试:3
2015-04-12 18:17:56:255:结束测试:3 执行次数:6000000
2015-04-12 18:17:56:256:开始测试:4
2015-04-12 18:18:04:374:结束测试:4 执行次数:6000000

执行插入600完成执行时间大约是9秒

  private static final SimpleDateFormat DF2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS: ");

     public static String getDateFormat1() {
         return DF2.format(new Date());
     }

     public static void main(String[] args) throws Exception {
         for (int j = 0; j < 5; j++) {
             serverID = j;
             id = 0;
             HashSet<String> ids = new HashSet<>(0);
             System.out.println(getDateFormat1() + "开始测试:" + j);
             int forCount = 600 * 10000;
             for (int i = 0; i < forCount; i++) {
                 //long tempid = getId();
                 String tempid = UUID.randomUUID().toString();
                 boolean add = ids.add(tempid);
                 if (!add) {
                     System.out.println(getDateFormat1() + "重复: " + i + "    " + tempid);
                 }
             }
             System.out.println(getDateFormat1() + " 结束测试:" + j + " 执行次数:" + forCount);
         }
     }

2015-04-12 18:19:34:589: 开始测试:0
2015-04-12 18:19:49:246: 结束测试:0 执行次数:6000000
2015-04-12 18:19:49:246: 开始测试:1
2015-04-12 18:20:00:516: 结束测试:1 执行次数:6000000
2015-04-12 18:20:00:516: 开始测试:2
2015-04-12 18:20:10:670: 结束测试:2 执行次数:6000000
2015-04-12 18:20:10:670: 开始测试:3
2015-04-12 18:20:20:401: 结束测试:3 执行次数:6000000
2015-04-12 18:20:20:401: 开始测试:4
2015-04-12 18:20:31:124: 结束测试:4 执行次数:6000000

同样是600完成大约是11秒

研究 研究而已 java和.net的HashSet对比的更多相关文章

  1. Java 集合系列 16 HashSet

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  2. 自由是有代价的:聊聊这几年尝试的道路 要想生活好,别看哲学书和思想书。简单看看可以,看多了问题就大了。还是要去研究研究些具体的问题。别jb坐在屋子里,嘴里念着海子的诗,脑袋里想康德想的事情,兜里屁都没有,幻想自己是大国总理,去想影帝是怎么炼成的。

    自由是有代价的:聊聊这几年尝试的道路 现在不愿意写过多的技术文章了,一点是现在做的技术比较偏,写出来看的人也不多,二来是家庭事务比较繁多,没以前那么有时间写了.最近,园子里多了一些写经历的文章,我也将 ...

  3. java源码之HashSet

    1,HashSet介绍 1)HashSet 是一个没有重复元素的集合.2)它是由HashMap实现的,不保证元素的顺序,而且HashSet允许使用 null 元素.3)HashSet是非同步的.如果多 ...

  4. Java集合框架之HashSet浅析

    Java集合框架之HashSet浅析 一.HashSet综述: 1.1HashSet简介 位于java.util包下的HashSet是Java集合框架的重要成员,它在jdk1.8中定义如下: publ ...

  5. Java set接口之HashSet集合原理讲解

    Set接口 java.util.set接口继承自Collection接口,它与Collection接口中的方法基本一致, 并没有对 Collection接口进行功能上的扩充,只是比collection ...

  6. Java中两个List对比的算法

    Java中两个List对比的算法:   // 测试数据 // tdcsDdt.add("Z"); // tdcsDdt.add("B"); // tdcsDdt ...

  7. 【转】Spring学习---Bean配置的三种方式(XML、注解、Java类)介绍与对比

    [原文]https://www.toutiao.com/i6594205115605844493/ Spring学习Bean配置的三种方式(XML.注解.Java类)介绍与对比 本文将详细介绍Spri ...

  8. 研究一些复杂java开源软件代码的体会(转)

    原文地址:http://herman-liu76.iteye.com/blog/2349026     有时候看源代码是非常有趣的事情,象是思考游戏,象是思考棋局...     平时做J2EE项目中, ...

  9. 关于telnet协议的研究以及用java进行封装实现自己的telnet客户端(转)

    最近在做一个远程控制的模块,其中用到了telnet协议,开始用的是apache-net包的telnetclient,但发现问题不少,比较慢,还有就是判断是否read完毕的问题.后来经过讨论打算实现自己 ...

随机推荐

  1. Microsoft .NET Native Developer Preview 内部初探(1)

    Microsoft .NET Native Developer Preview 内部初探(1) MS 前段时间发布了.NET Native Developer Preview,被广大人员赋予“C++的 ...

  2. Async Console Programs 异步控制台程序

    如果你正在写一个控制台程序,你可能最终想要一个异步的main方法,像这样: class Program { static async void Main(string[] args) { ... } ...

  3. UWP的一种下拉刷新实现

    简介 我们最近实现了一个在UWP中使用的下拉刷新功能,以满足用户的需求,因为这是下拉刷新是一种常见的操作方式,而UWP本身并不提供这一机制. 通过下拉刷新这一机制,可以让移动端的界面设计变得更加简单, ...

  4. Web 数据存储总结

    随着Web应用程序的出现,也产生了对于能够在客户端上存储用户信息能力的要求.这个问题的第一个解决方案是以cookie形似出现的.网景公司在一份名为“Persistent Client State: H ...

  5. SlipHover,能感知鼠标方向的图片遮罩效果jQuery插件

    接上一篇博文,介绍完jQuery插件开发后这里上一个自己的作品,也是初次实践,小有成就的感觉. 话说这个插件年前就写好了,然后挂到GitHub,然后就偷偷看着Google Analysis心中暗自激动 ...

  6. read links July-14

    1)   http://ruby-hacking-guide.github.io/intro.html It has one part to discuss “Technique to read so ...

  7. SpringMVC自定义注入controller变量

    springmvc config the controller parameter injection 问题描述 在SpringMVC中默认可以注入Model,ModelAndView,@Reques ...

  8. struts2学习笔记之七:Result类型

    一:关于Struts2的type类型,也就是Result类型,他们都实现了共同的接口Result,都实现了execute方法 他们体现了策略模式,具体Result类型参见:struts-default ...

  9. Atitit vod click event design flow  视频点播系统点击事件文档

    Atitit vod click event design flow  视频点播系统点击事件文档 重构规划1 Click cate1 Click  mov4 重构规划 事件注册,与事件分发管理器分开 ...

  10. Atitit 团队建设的知识管理

    Atitit 团队建设的知识管理 1.1. 要遵循"知识积累--创造--应用--形成知识平台--再积累--再创造--再应用--形成新的知识平台"的循环过程.1 1.2. 显性知识包 ...