C ++(英特尔)和Java(热点)与C#基准的问题(代码和结果包括)

我一直在三个主要语言之间的比较原始的CPU性能的速度(代码和结果如下)。 我作为主要语言如何比较为原料的计算能力非常好奇。 我有一个理论,Java和C#也可能是竞争对手C ++在没有内存开销参与。

我的问题:

1)编辑(C ++计时现在更加逼真)

2)我是正确的思维JVM中花了很长时间在第一次迭代,但对于第二个它必须完成分析,因此进行了优化? 热点怎么知道来完成我的外循环的第一次迭代后优化,而不是半途?

3)为什么C#不执行,如Java和起步巨资优化? 什么是关于C#与问候的Java有什么不同? 为什么是C#slower-是单纯由于较少的优化?

4)是否有任何具体原因为C#测试计时2246和2262毫秒之间振荡,这可能是因为CPU有两个内核两个不同的时代?

编辑:更新的代码显示在C#代码秒表的使用。

编辑:正确的C ++代码的时间和结果

安装:

  • C ++:VS2010和英特尔编译器(建于发布模式,优化:O2,启用内部函数:是的,看好大小,也速度:没有,省略帧指针:没有,使纤维安全优化:没有,整个程序优化:是)
  • Java的:Eclipse中,热点64位编译器版本17,Java 1.6的
  • C#:VS2010和.NET 4.0(建于发布模式)
  • CPU:英特尔E6600(2.4GHz的)为2.7GHz运行,总线速度300MHz的,8GB内存,内存频率:375MHz处
  • Win 7的(64位)

C ++代码:

#include "stdafx.h" #include <iostream> #include <stdio.h> #include <windows.h> #include <mmsystem.h> #include <stdio.h> #include <fstream> using namespace std; double PCFreq = 0.0; __int64 CounterStart = 0; void StartCounter() { LARGE_INTEGER li; if(!QueryPerformanceFrequency(&li)) cout << "QueryPerformanceFrequency failed!\n"; PCFreq = li.QuadPart; QueryPerformanceCounter(&li); CounterStart = li.QuadPart; } double GetCounter() { LARGE_INTEGER li; QueryPerformanceCounter(&li); return double(li.QuadPart-CounterStart)/PCFreq; } static long counter = 0; int _tmain(int argc, _TCHAR* argv[]) { for (int m = 0; m < 10; m++) { StartCounter(); counter = 0; for (int j = 0; j < 3; j++) { //Just to test timing is working correctly //int* p = new int; for (long i = 0; i < 200000000; i++) { counter++; } } cout << GetCounter()*1000000 << " microseconds" << endl; } int p = 0; cin >> p; return 0; }

C ++的结果:

7.19微秒

1.89

2.27

1.51

4.92

10.22

10.22

9.84

9.84

10.6

Java代码:

public class main { static long counter = 0; public static void main(String[] args) { for(int m=0; m<10; m++){ long start = System.nanoTime(); counter = 0; for(int j=0;j<3; j++){ for(long i=0; i<200000000; i++){ counter++; } } System.out.println(((System.nanoTime()-start)/1000000) + " ms"); } } }

Java的结果:

5703 milliseconds 471 ms 468 ms 467 ms 469 ms 467 ms 467 ms 467 ms 469 ms 464 ms

C#代码:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics namespace t1 { class Program { static long counter = 0; static void Main(string[] args) { for (int m = 0; m < 10; m++) { Stopwatch s = new Stopwatch(); s.Start(); counter = 0; for (int j = 0; j < 3; j++) { for (long i = 0; i < 200000000; i++) { counter++; } } s.Stop(); Console.WriteLine(s.Elapsed.TotalMilliseconds + " ms"); } Console.ReadLine(); } } }

C#的结果:

2277毫秒

2246毫秒

2262毫秒

2246毫秒

2262毫秒

2246毫秒

2262毫秒

2246毫秒

2262毫秒

2262毫秒

--------------解决方案-------------

你必须在你的C ++代码,它使用一个逻辑问题QueryPerformanceFrequency

PCFreq = double(li.QuadPart)/1000000000.0; // <- this is not correct
PCFreq = li.QuadPart; // <- this is correct

你应该分配li.QuadPartPCFreq做转换到您的打印代码毫秒或纳秒:

// convert from seconds to milliseconds
cout << GetCounter() * 1000.0 << endl;

随着这一变化,我得到了你的C ++代码的实际时间。 无论这些时序为“有效”或进行比较有用的,我不会评论。

1 - Sixlettervariables似乎都指出你的错误就这一个

2 - 热点将优化代码。 这里有一个类似的问题也上看到环路10倍的速度提升。 所以,你看到的是预期的输出。 一个Java循环运行SLOW第一次,为什么呢? [太阳的HotSpot 1.5,SPARC]

3 - 我不知道有足够的了解C#在这一个帮助。 这是可能的不优化的内部循环(你有3个不同的循环)。 也许尝试提取2个循环您测试了一个完全不同的方法,看看是否有帮助。

4 - 日期时间是代表一个日期和时间,不高精度定时。 因此,它不是那么准确。 DateTime.Now具有10ms的分辨率,据我所知

(仅供参考,这篇文章对JIT,C#和C ++优化一些很好的说明这可以帮助你:C ++性能与的Java / C#)

我认为这是可能的,编译器将在编译时计算计数器的值,并通过你的循环不会重复。

我认为,一个简单的计数器是一个非常糟糕的基准。

顺便说一句,尽量在方法中运行Java代码。 这可能是因为的JIT优化更快。 (但我不知道)

对于各种编译器基准测试已经完成,非常漂亮,放在一起。

计算机语言基准游戏

Java 7的服务器与GNU C ++

C#单与GNU C ++

C#单声道和Java 7服务器

虽然Java 7的服务器比C#单2.10.8看的内存,Java 7的利用量更快。

分类:C# 时间:2012-01-01 人气:0
本文关键词: 性能,JAVA,缓存
分享到:

相关文章

  • 在分布式环境中的Java缓存 2013-02-28

    我应该创建用java的量将在分布式环境中使用内部用途的简单复制缓存. 我看到Oracle实现复制缓存服务. 我现在面临的问题是,在做一个更新或删除,我获得对其他缓存的锁点缓存获取的更新和更改通知其他人. 这最终会进入一个死锁情况,同时去除. 有没有什么策略,我应该遵循在更新或从缓存中的删除. 我可以实现无需主缓存复制缓存? --------------解决方案------------- 您可以检出GigaSpaces的XAP这是一个完全事务分布,使之支持以及许多其他的事情,完全复制拓扑内存数据网

  • 当它是一个很好的时间来释放的Java缓存的对象? 2014-01-14

    我开发Java桌面应用程序在那里我有很多的缓存,比如对象池,缓存JPanels ...等. 例如:当从一个面板到另一个用户切换,我不破坏前一个的情况下,用户切换回. 但是,当系统在我消费不是那么名正言顺这些内存资源的迫切需要的应用程序内存消耗可能会高... 在iOS应用程序,我会"applicationDidReceiveMemoryWarning"的方法释放这些. 但在Java ...? 所以,当它是一个很好的时间来释放的Java缓存的对象? --------------解决方案--

  • 任何Java缓存,可以限制内存高速缓存的内存使用量,而不仅仅是实例数? 2012-02-27

    我要寻找一个简单的内存(在进程中)缓存查询数据短期缓存(但短期意义超出请求/响应,即会话边界). Ehcache的可能会工作,但它看起来好像它可能无法提供有一点我需要:限制不缓存对象的数量,但(近似)限制对内存缓存的数据消耗量. 我明白,这是很难找出确切的内存使用情况给定对象没有序列化(这是我想避免在一般情况下,由于其缓慢的失败的目的对我的使用),和我很好的无需提供大小的估计自己. 所以:有一个简单的开源Java缓存允许定义缓存对象的"重量",以限制对事物量的缓存? 编辑(2010年1

  • 什么开源Java缓存框架是最流行的,为什么? 2015-03-07

    我在找一个开源的Java缓存框架在我的web应用程序使用. 我想很明显不错的功能,简单而强大的,高度可配置却高标准的默认值. 谢谢 --------------解决方案------------- 的EHCache 番石榴的CacheBuilder提供了一个强大且类型安全的选项内存缓存. 这是在与像Memcached的或关闭的Ehcache - 服务器解决方案相反,并且可以在串联与它们一起使用. 见番石榴的CachesExplained文章以获得更多信息. Ehcache的或memcache的.

  • 是否有任何现有的Java缓存门面? 2013-11-19

    我正准备开始在最终将运行分布式应用程序性能的工作,但目前在[新建]发展. 我希望能够在没有任何选择或承诺特定库引入缓存,所以我想知道是否有缓存的门面库(类似于SLF4J用于日志记录)已经存在,让我做出决定的以后的日子. --------------解决方案------------- 还有一个Java标准:JSR 107:JCACHE - Java的临时缓存API. 差不多死了,但有一些运动半年前. 也有相当多发生在源代码库. 的Ehcache支持该JSR本身. 如果您使用的是春天,它有一个很大的

  • 如何有效地完成我使用可用的RAM中的Java缓存中的对象? 2014-01-01

    我需要缓存使用任何比例的RAM可在Java对象. 我知道,其他人问过这个问题,但没有任何回应的满足我的要求. 我的要求是: 简单的轻量级 比一个普通的HashMap不显着慢 使用LRU,还是有些近似LRU删除策略 我试过的L​​inkedHashMap,但它需要你指定元素的最大数量,我不知道这将有多少元素需要来填充可用内存(其大小会有所不同显著). 我目前的做法是使用谷歌收集的地图制作工具,如下所示: Map<String, Object> cache = new MapMaker().sof

  • 为什么不是整数用Java缓存? 2014-06-18

    我知道有关于这个专题相近岗位,但他们并没有完全解决我的问题. 当你这样做: Integer a = 10; Integer b = 10; System.out.println("a == b: " + (a == b)); 这将(显然)打印true因为在[-128,127]之间的整数在某种程度上缓存的大部分时间. 但: Integer a = new Integer(10); Integer b = new Integer(10); System.out.println("

  • is_file / file_exists性能和缓存 2013-02-26

    我做了一些测试,比较和衡量这两种功能的速度.is_file似乎是快好几倍(我用10000迭代两者)比file_exists. 我不知道PHP或OS使用一些缓存这些功能还是始终访问硬盘? 我觉得没什么,但我不知道...... 我用这个代码: <?php $time = microtime(); $time = explode(' ', $time); $begintime = $time[1] + $time[0]; for($i=0;$i<10000;$i++) file_exists('/A

  • 在Java缓存系统的压缩功能 2013-03-20

    我建立了具有存储尽可能多的数据可能缓存. CPU是不是一个市长的问题,因为数据的一个新的水平是一个很大的expessive达到比运行的CPU进行解压缩一点. 我在寻找一个很好的策略,而不是一个完整的实行. 应缓存的典型对象实例可以gernalized作为包含HashMap的列表. 在这些地图中的键是非常相似,在该列表中的另一个映射键. 键和值都是字符串. 映射在不同的高速缓存对象(这也意味着不同的列表)可能不总是具有相似的密钥. 也许只有钥匙的一个子集(50%)是一样的. 我想提取键成一个头阵列

  • 应出现数据变化频繁使用什么类型的Java缓存? 2014-05-04

    我有一个JSP其中许多聚集类型的显示数据. 例如,通过市场,按类别,按服务器类型,等等.我已经是出版商和时间的数据. 发布的数据是,在我的情况下,最精细的水平. 现在,在每1/2小时这个数据的变化. 每半小时的数据的数量几乎是5K和任何一次查找数据进行4小时至24小时. 在这些情况下,当服务器正在迅速加载JSP的加载时间的增加. 我试图使用和LRU缓存中的LinkedHashMap,但似乎不是最佳的解决方案,因为表现依然不好. 要使用的数据结构的任何想法,将不胜感激. -------------

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.758 (s). 10 q(s)