我目前的任务是优化蒙特卡罗模拟,该模拟根据一组Obligors计算资本充足率数据.
它运行大约10倍太慢,无法生产,需要数量或每日运行.此外,结果数字的粒度需要在某个阶段提升到桌面可能的书本水平,我给出的代码基本上是一个原型,由半生产能力的业务部门使用.
该应用程序目前是单线程的,所以我需要使它多线程,可能看看System.Threading.ThreadPool或Microsoft Parallel Extensions库但我在这家银行的服务器上受限于.NET 2所以我可能不得不考虑这个人的端口,http://www.codeproject.com/KB/cs/aforge_parallel.aspx.
我正在尽力让他们升级到.NET 3.5 SP1,但这是在这种规模的组织中的一项重要练习,在合同时间框架内可能无法实现.
我使用dotTrace的试用版(http://www.jetbrains.com/profiler)描述了该应用程序.还有哪些好的剖析器?免费的?
大量的执行时间用于生成均匀的随机数,然后将其转换为正态分布的随机数.他们正在使用C#Mersenne twister实现.我不确定他们在哪里获得它,或者它是最好的方法来实现这个(或最佳实现)来生成统一的随机数.然后将其转换为正态分布版本以供计算使用(我还没有深入研究过翻译代码).
使用以下内容的经验是什么?
http://www.qlnet.org(Quantlib的C#端口)或
您知道的任何替代方案?我是C#开发人员,所以更喜欢C#,但C++的包装应该不是问题,是吗?
也许更快地利用C++实现.我认为这些库中的一些库将具有最快的方法来直接生成正态分布的随机数,而无需转换步骤.此外,他们可能还有一些其他功能,将有助于后续计算.
此外,它所使用的计算机是四核Opteron 275,8 GB内存,但Windows Server 2003 Enterprise 32位.我应该建议他们升级到64位操作系统吗?任何支持这一决定的文章的链接都将非常感激.
无论如何,任何建议和帮助你都非常感激.
在Windows/Linux平台上,我作为一个普通的计算机用户,几乎找不到任何用Java编写的软件.
而且我找不到在桌面应用程序领域用Java编写的软件.程序员似乎更喜欢使用跨平台的Widgets(Qt,wxWidgets等)而不是Java.
我的问题是:
谢谢.
我需要通过两个Android设备之间的套接字发送500,000个int的数组.目前,我花了很多时间将int []转换为byte [],这样Java的套接字就会接受它(参见我之前的问题,在Java中的套接字上有效地发送大型int [],我们确定没有更快的方法在Java中进行类型转换).
我现在的问题是,如果我将int []并通过JNI传递给Android NDK,我是否可以期望在本机代码中将字节转换为byte []更快?我知道在普通的C中,对*char进行类型转换是非常简单的,但是我想知道JNI是否会否定任何性能提升.
此外,一旦我的本机代码中有一个byte [],我是否可以有效地将其传递回我的Java代码,或者我是否还需要在C中实现套接字?
编辑1:人们在没有点击链接的情况下发布了大量答案.使用ByteBuffers不是一个好的选择,它实际上比掩码和移位慢,这仍然比我的性能关键代码需要慢!这就是我问NDK的原因.
编辑2:我改变了上面的文字,说C代码可以从int*转换为char*而不是int []转换为byte [].希望这澄清了这个问题.
编辑3:为了澄清我的用例,这是一个研究问题,我在多个设备上分配大量的int并且并行地对列表进行排序.假设我在Java中有500,000个整数(无论它们来自哪里)我需要尽快通过套接字将它们从设备中取出.说"不要以一系列整数开头"的答案没有帮助.此外,我的应用程序代码需要尽可能接近100%的Java.如果原生的类型转换和套接字提高了性能,那没关系,但我不能做其他任何事情(即排序)本地.
使用两个相同的mergesort算法,我测试了C++(使用Visual Studios C++ 2010 express)和Java(使用NetBeans 7.0)的执行速度.我推测C++执行至少会稍微快一点,但测试显示C++执行速度比Java执行慢4到10倍.我相信我已经为C++设置了所有速度优化,而且我发布的是发布而不是调试.为什么会出现这种速度差异?
public class PerformanceTest1
{
/**
* Sorts the array using a merge sort algorithm
* @param array The array to be sorted
* @return The sorted array
*/
public static void sort(double[] array)
{
if(array.length > 1)
{
int centre;
double[] left;
double[] right;
int arrayPointer = 0;
int leftPointer = 0;
int rightPointer = 0;
centre = (int)Math.floor((array.length) / 2.0);
left = new double[centre];
right = new double[array.length - centre]; …Run Code Online (Sandbox Code Playgroud) 发布此查询以基本上了解诸如
对象是类实例或数组;
数组是类的子Object类;
在 Java 中,除了基元之外的所有实例化都是对象。
这是我对在 Java 中使用数组的理解。
考虑到下面的程序,
/* dummy.java */
class C {
private int i;
public C() {
i = 1;
System.out.println("Am in constructor");
}
}
public class dummy {
public static void main(String[] args) {
C[] c = new C[2]; // Line 11
c[0] = new C();
System.out.println(c);
}
}
Run Code Online (Sandbox Code Playgroud)
类型的对象class [LC在运行后在运行时创建,
C[] c = new C[2]; //Line 11
Run Code Online (Sandbox Code Playgroud)
在上面的代码中。class [LC是类的直接子Object类。在上面的代码中c运行后,引用变量指向这个对象(如下图红色边界所示)Line 12。引用变量位于堆栈中,类型的对象class …
我在阅读了这个问题的答案/讨论之后注意到了(学习OOP的最佳语言是什么?) - 越来越多的人推荐使用C#或Java而不是C++来学习OOP.在该答案页面上进行简单的术语搜索会导致C++的10次点击,C#的21次点击和Java的27次点击.
现在,我理解这两种语言解决了C++的许多怪癖和问题,并查找了主要与性能,JVM与本机实现,系统焦点与应用程序,手动内存管理与自动化等相关的这些 资源.
我的问题是 - Java/C#与C++的OO功能有任何根本区别吗?或者前者是否仅仅因为它们的通用易用性/后者的改进而被推荐?
谢谢.
PS,我知道Java接口继承与C++多重继承有区别.我认为这是一个实现的而不是功能性的.
哇,我没想到这么多答案!非常感谢.我将在此处更新我所学到的内容.
我有点像编程的菜鸟,但我想知道你是否用两种不同的编译语言(即java和c ++)编写两个相同的程序,并在编译后运行它们,运行时是否有所不同或者只是编译时间有什么不同?
可能重复:
C++比C#快多少?
你好!
在实际应用中,C#是否比C++更快(具有更好的性能)?
我听说泛型集合比stl具有显着的性能优势 - 这是真的吗?
用C#编写的本机代码(不安全块,引脚指针,Marshal ......)与C++本地编写的相同代码具有相同的性能吗?
我一直在考虑机器代码如何特定于架构以及Javascript如何在(几乎)每个浏览器中工作.我一直在研究一个必须做一些严肃计算的项目,它是基于Javascript的,需要一分钟才能完成计算.它让我渴望C的速度.但是项目使用Javascript的全部原因是为了简单和便携.
这给了我一个想法,如果有一种类似于Javascript的语言,就像在每个架构上一样可移植并作为可执行文件运行,该怎么办?大多数人会指向Java,但我正在考虑一些开销较少且由操作系统处理的东西.不是字节代码,而是本机机器代码.
做了一些研究和思考,以实现这项任务的不可能性.您如何制作一个像普通C编写的应用程序一样小的可执行文件,该应用程序适用于在每个体系结构上工作的特定体系结构,速度与在C中为该体系结构本地编译的速度相同?
这是我的下一个想法.本机机器代码特定于架构,每个架构都具有某些特殊功能,有时以不同方式处理相同的任务.某些优化也是针对每个体系结构的.如果有通用机器代码怎么办?当操作系统将指令加载到ram中时,它会自动转换指令以适应架构.或许(更疯狂的想法)CPU可以包含接收通用机器代码并自动将通用机器代码调整到其本机代码中的能力?
通用机器代码规范必须足够通用,以涵盖正常的机器代码功能.
当然,如果通用机器代码确实有效,人们可能会想要一个由所有操作系统处理的通用可执行格式.这样,可执行文件不需要在OS上进行更改.这导致需要专门针对机器进行通用的框架.更多的细节将是操作系统特定的功能,输入和输出的能力超出我所知的范围.
Universal Machine Code编译可执行文件:
优点:
缺点:
这可行吗?
编辑:
我用过Java,在其中制作游戏.它不像我想的那样普遍,也不像友好.*它是由Oracle维护的自己的编程语言.专有和有点太大.需要在某些机器上安装.
更具体地说,我不是在谈论使用新的编程语言.我正在谈论拥有一种新的机器代码语言,该语言拥有足够的额外信息,在执行时,会将一个非常薄的过程转换为架构的机器代码.这样C编译器就可以将它们的可执行文件编译成通用机器代码,并且可执行文件可以在任何地方运行.
assembly computer-science machine-code computer-architecture
大家好我已经开始学习Java了,我听说过它很慢.对于一个实验,我用C++和Java编写了两个似乎相同的程序
import java.util.*;
class Java {
public static void main(String args[]) {
long beg = System.currentTimeMillis();
for (int i = 0; i < 200000000; ++i) { }
long end = System.currentTimeMillis();
System.out.println(end - beg);
}
}
Run Code Online (Sandbox Code Playgroud)
输出334
#include <cstdio>
#include <ctime>
int main() {
double beg = clock();
for (int i = 0; i < 200000000; ++i) { }
double end = clock();
printf("%f\n", (end - beg) / double(CLOCKS_PER_SEC) / 1000.0);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出0.000810
我有点困惑.Java真的那么慢,或者我做错了什么?
我只读了C++性能与Java/C#.
正如之前的帖子中所说,JIT可以在运行时将IL /字节码编译为本机代码.提到的成本,但没有得出结论:
JIT有一个很大的问题就是它无法编译所有内容:JIT编译需要时间,所以JIT只会编译代码的某些部分,而静态编译器会生成一个完整的原生二进制文件:对于某些类型的程序,静态编译器将轻松胜过JIT.
我很好奇为什么java在设备中安装时不会编译所有内容.
如果是这样,我们不需要考虑编译时间的性能损失,并且符合各种设备.
Java应用程序是否可能比用C++编写的程序更快?另外,编译中的发布模式是什么?
java ×9
c++ ×5
c# ×3
performance ×3
runtime ×2
android ×1
android-ndk ×1
arrays ×1
assembly ×1
casting ×1
compilation ×1
jit ×1
jvm ×1
machine-code ×1
montecarlo ×1
netbeans ×1
new-operator ×1
object ×1
oop ×1
random ×1
visual-c++ ×1