相关疑难解决方法(0)

FOR循环的最快语言

我正在试图找出我正在构建的分析模型的最佳编程语言.主要考虑因素是它运行FOR循环的速度.

一些细节:

  • 该模型需要对数组中的一组元素执行大量(每次输入约30次,超过12次循环)操作 - 阵列中有大约300k行和~150列.这些操作中的大多数本质上是逻辑的,例如,如果place(i)= 1,则j(i)= 2.
  • 我使用Octave构建了这个模型的早期版本 - 在Amazon EC2 m2.xlarge实例上运行它需要大约55个小时(它使用~10 GB的内存,但我非常乐意在内存中添加更多内存它).Octave/Matlab不会进行元素逻辑运算,因此需要大量的for循环 - 我相对确定我已经尽可能地向量化了 - 剩下的循环是必要的.我已经得到了八度多核以使用这个代码,这有一些改进(当我在8个EC2内核上运行时减速约30%),但最终会因文件锁定等而变得不稳定.+我真的寻找运行时的一个步骤变化 - 我知道实际使用Matlab可能会让我从一些基准测试中获得50%的改进,但这是成本过高的.
  • 下一个版本将是从头开始的完整重建(出于IP原因,我不会进入其他任何事情),所以我完全接受任何编程语言.我最熟悉Octave/Matlab,但涉及R,C,C++,Java.如果解决方案涉及将数据存储在数据库中,我也熟练使用SQL.我将学习任何语言 - 这些并不是我们正在寻找的复杂功能,没有与其他程序的接口等,所以不要太在意学习曲线.

所有这些都说明了什么是FOR循环中最快的编程语言?从搜索SO和Google,Fortran和C泡沫到顶部,但在潜入其中之前寻找更多建议.

谢谢!

performance matlab loops

6
推荐指数
4
解决办法
3940
查看次数

如何设计极其高效的功能

我正在设计一个函数(Java方法),它将在移动设备上每秒执行40-80次.

我希望避免产生大量由GC收集的死变量,因为函数运行(可能在应用程序的整个生命周期中).

在CI中可能会使用volatile例如,在每次执行函数时阻止我的变量的内存分配...我想在Java中做类似的事情,但不知道如何.

该函数存储数据

  • 1个字符串
  • 4个整数
  • 2个1维字符串数组

一般来说,在Java中,使用上述变量的首选方法是什么,但每次执行函数时都不重新分配它们(每秒40次以上)?

成员变量会"起作用",但这是最好的解决方案吗?

谢谢!布拉德

java optimization memory-management

6
推荐指数
1
解决办法
263
查看次数

Java中Collection类的性能

所有,

我一直在浏览很多关于各种Action类的性能的网站,包括添加元素,搜索和删除.但我也注意到它们都提供了不同的测试环境,即操作系统,内存,线程运行等.

我的问题是,是否有任何网站/材料在最佳测试环境基础上提供相同的性能信息?即,配置不应成为任何特定数据结构性能不佳的问题或催化剂.

[更新]:示例,HashSet和LinkedHashSet都具有插入元素的复杂度O(1).但是,Bruce Eckel的测试声称,LinkedHashSet的插入时间比HashSet要多[http://www.artima.com/weblogs/viewpost.jsp?thread=122295].那么我还应该使用Big-Oh表示法吗?

java collections performance

6
推荐指数
3
解决办法
3072
查看次数

使用>>,>,> |,||,| <,<,<<进行可视化调试

使用标准调试器调试性能问题几乎没有用,因为细节级别太高.其他方式使用分析器,但它们很少给我提供良好的信息,特别是当涉及GUI和后台线程时,因为我从来不知道用户是否实际上在等待计算机.另一种方法是使用Control + C并查看它停止的代码中的位置.

我真正想要的是快速前进,播放,暂停和倒带功能以及代码的一些视觉代表.这意味着我可以将代码设置为在Fast Forward上运行,直到我将GUI导航到关键位置.然后我将代码设置为以慢速模式运行,同时我得到一些视觉表示,正在执行哪些行(可能是某种缩小的代码视图).例如,我可以将执行速度设置为0.0001x.我相信我会以这种方式获得非常好的可视化,无论问题是在特定模块内部,还是在模块之间的通信中.

这存在吗?我的具体需求是在Python中,但我有兴趣在任何语言中看到这样的功能.

python java debugging performance debuggervisualizer

6
推荐指数
1
解决办法
174
查看次数

用于cpu profiling的过滤类是否适用于Java VisualVM?

我想在Java VisualVm(版本1.7.0 b110325)中过滤哪些类是cpu-profiled.为此,我尝试在Profiler - > Settings - > CPU-Settings下将" Profile only classes "设置为我的测试包,这没有任何效果.然后我尝试通过在" 不要分析类 "中设置它们来摆脱所有java.*和sun.*类,这些也没有效果.

这只是一个错误吗?或者我错过了什么?有解决方法吗?我的意思是:

我想这样做主要是为了获得每个方法消耗的CPU的正确百分比.为此,我需要摆脱烦人的测量,例如sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run()(约70%).很多用户似乎都有这个问题,例如

java profiler profiling visualvm jvisualvm

6
推荐指数
1
解决办法
5053
查看次数

为什么Java CPU配置文件(使用visualvm)在一个什么都不做的方法上显示如此多的命中?

这是我以前在其他环境中使用其他分析工具时所看到的,但在这种情况下它尤其引人注目.

我正在运行一个运行大约12分钟的任务的CPU配置文件,并且它显示了几乎一半的时间花费在一个字面上什么都不做的方法:它有一个空体.是什么导致这个?我不相信这种方法被称为荒谬的次数,当然不会占用执行时间的一半.

对于它的价值,所讨论的方法称为startContent(),它用于通知解析事件.事件沿着一系列过滤器传递(可能是十几个),并且每个过滤器上的startContent()方法除了在链中的下一个过滤器上调用startContent()之外几乎没有任何作用.

这是纯Java代码,我在Mac上运行它.

附件是CPU采样器输出的屏幕截图:

CPU采样器截图

这是一个显示调用堆栈的示例:

CPU采样器示例调用堆栈

(因休假而延误)以下是一些显示探查器输出的图片.这些数字远远超出我期望的配置文件的样子.探查器输出似乎完全有意义,而采样器输出是虚假的.

CPU分析器输出1 CPU分析器输出2

正如你们中的一些人已经猜到的那样,有问题的工作是Saxon XML模式验证器的运行(在9Gb输入文件上).该配置文件显示大约一半的时间用于验证元素内容与简单类型(在endElement处理期间发生),大约一半用于测试关键约束的唯一性; 两个探查器视图显示了该任务的这两个方面所涉及的活动.

我无法提供来自客户端的数据.

java performance visualvm

6
推荐指数
1
解决办法
4337
查看次数

多维数组和数组的数组的性能

我一直认为并且知道,由于更好的局部性和节省空间,仅通过乘法完成一次索引的多维数组比通过两个指针取消引用完成索引的数组数组更快。

前一段时间我做了一个小测试,结果很令人惊讶。至少我的 callgrind 分析器报告说使用数组数组的相同函数运行速度稍快一些。

我想知道是否应该更改矩阵类的定义以在内部使用数组数组。这个类几乎在我的模拟引擎中随处使用(?不太确定如何调用..),我确实想找到节省几秒钟的最佳方法。

test_matrix成本为350 200 020test_array_array成本为325 200 016-O3该代码由编译clang++。所有成员函数都是根据探查器内联的。

#include <iostream>
#include <memory>

template<class T>
class BasicArray : public std::unique_ptr<T[]> {
public:
    BasicArray() = default;
    BasicArray(std::size_t);
};

template<class T>
BasicArray<T>::BasicArray(std::size_t size)
: std::unique_ptr<T[]>(new T[size]) {}

template<class T>
class Matrix : public BasicArray<T> {
public:
    Matrix() = default;
    Matrix(std::size_t, std::size_t);
    T &operator()(std::size_t, std::size_t) const;
    std::size_t get_index(std::size_t, std::size_t) const;
    std::size_t get_size(std::size_t) const;

private:
    std::size_t sizes[2];
};

template<class T>
Matrix<T>::Matrix(std::size_t i, …
Run Code Online (Sandbox Code Playgroud)

c++ arrays performance multidimensional-array

6
推荐指数
2
解决办法
274
查看次数

如何独立测量所用机器的性能

我有一个表现良好的例程.但是,我不得不改变它.这种改变提高了程序的精确度但却损害了性能.

例程是大量的数学计算,可能是CPU绑定(我仍然需要对此进行更严格的测试,但我99%肯定).它是用C++编写的(编译器是Borland C++ 6).

我现在想测量一下例程的性能,首先我考虑测量执行时间,但在我看来这是一种有缺陷的方法,因为可能会有更多的事情发生.

然后我讨论了这个主题:测量应用程序性能的技术 - Stack Overflow.我喜欢通过MFlops测量的想法.

我的老板建议尝试通过cpu时钟周期进行某种测量,因此测试将与机器无关,但是,我认为这种方法属于MFlops测试.

在我看来,衡量两件事(执行时间和MFlops)是要走的路,但我想听听stackoverflow专家你们的想法.

测量CPU绑定例程性能的方法是什么?

c++ performance profiler

5
推荐指数
2
解决办法
1965
查看次数

在Java中分析本机方法 - 奇怪的结果

我一直在使用Yourkit 8.0来分析在Mac OS X(10.5.7,Apple JDK 1.6.0_06-b06-57)下运行的数学密集型应用程序,并注意到CPU分析结果中有一些奇怪的行为.

例如 - 我使用抽样进行了分析运行,其中报告了应用程序的10分钟运行时的40%用于StrictMath.atan方法.我发现这令人费解,但我接受了它的话,花了一点时间用非常简单的多项式拟合替换atan.

当我再次运行应用程序时,它几乎与以前完全相同(10分钟) - 但我的atan替换在分析结果中无处可见.相反,其他主要热点的运行时百分比只是增加以弥补它.

总结一下:

结果使用StrictMath.atan(本机方法)
总运行时间:10分钟
方法1:20%
方法2:20%
方法3:20%
StrictMath.atan:40%

结果简化,纯Java atan
总运行时间:10分钟
方法1:33%
方法2:33%
方法3:33%

(方法1,2,3不执行任何atan调用)

知道这种行为是什么吗?我使用EJ-Technologies的JProfiler获得了相同的结果.似乎JDK概要分析API报告了本机方法的不准确结果,至少在OS X下是这样.

java macos profiling native yourkit

5
推荐指数
1
解决办法
778
查看次数

我应该像C++一样优化我的python代码吗?有关系吗?

我和一位同事讨论过有效编写python的问题.他声称虽然你正在编写python,你仍然需要尽可能地优化软件的一点点,就像你在C++中编写一个有效的算法一样.

像:

  • 在一个if声明中,or总是把条件最有可能先失败,所以第二个不会被检查.
  • 使用最有效的函数来操作常用的字符串.不是研磨字符串的代码,而是简单的事情,比如进行连接和分割,以及查找子字符串.
  • 尽可能少地调用函数,即使它以牺牲可读性为代价,因为它会产生开销.

我说,在大多数情况下,这并不重要.我还应该说,代码的背景不是超高效的NOC或导弹制导系统.我们主要是在python中编写测试.

你对此事有何看法?

python performance

5
推荐指数
3
解决办法
741
查看次数