我在matlab 2011a中遇到了严重的匿名函数性能问题,其中匿名容器函数引入的开销远远大于封闭函数本身所花费的时间.
我已经阅读了几个相关问题,其中用户帮助解释了这是其他人遇到的问题,这表明我可以通过取消匿名容器来大幅提高性能.不幸的是,我的代码结构是这样的,我不知道如何在不破坏很多东西的情况下做到这一点.
那么,是否存在改进匿名函数性能而不完全消除它们的变通方法,或者设计模式以允许我不使用代码并花费大量时间进行重构而取消它们?
一些可能有用的细节:
下面是匿名函数的集合,它们存储为类属性.使用由switch语句反过来使用的int数组原则上可以替换数组,但是GP的内容可能会发生变化 - 还有其他函数具有与可以在那里使用的traing相同的参数结构 - 和在某些情况下,GP的内容可以在运行时确定.
m3.GPs = {@(X,ytrain,xStar,noisevar,params)traingp(X,ytrain,xStar,noisevar,1,params,[1 0]');
@(X,ytrain,xStar,noisevar,params)traingp(X,ytrain,xStar,noisevar,1,params,[-1 1]');
@(X,ytrain,xStar,noisevar,params)traingp(X,ytrain,xStar,noisevar,2,params,0);
@(X,ytrain,xStar,noisevar,params)traingp(X,ytrain,xStar,noisevar,3,params,0);
@(X,ytrain,xStar,noisevar,params)traingp(X,ytrain,xStar,noisevar,4,params,[0 0 0]')};
Run Code Online (Sandbox Code Playgroud)
之后,GP的元素由类的成员函数调用,如下所示:
GPt = GPs{t(j)}(xj,yj,gridX(xi),thetaT(1),thetaT(2:end));
Run Code Online (Sandbox Code Playgroud)
根据分析器,匿名包装器的自我时间占总时间的95%(44次调用为1.7秒!),而所包含的函数为5%.我在其他地方使用类似的方法,按比例说,匿名包装器的成本更高.
有没有人对如何减少匿名调用的开销有任何想法,或者,如果没有,如何替换匿名函数同时保留他们提供的灵活性(并且不引入一堆额外的簿记和参数传递)?
谢谢!
我一直在使用JUNG来可视化一些简单的图形,我想将它们中的几个写入PNG文件.不幸的是,图像经常在图形完成绘制之前呈现出来,这意味着我得到了不完整的图形 - 也就是说,只绘制了一个边缘或节点的图形 - 大约一半的时间.渲染到屏幕工作正常,这是我为什么如此困惑的一部分.正如您将在下面看到的,我尝试了几种解决方法,但它们没有帮助.知道我正在使用的basicVisualizationServer不会直接绘制对BufferedImage有用的东西可能很有用 - 我尝试时只得到一个黑色图像.
谢谢!
public void writeImage(String filename) {
Layout layout = new CircleLayout<V, E>(jungGraph);
layout.setSize(innerSize);
bvs = new BasicVisualizationServer<V,E>(layout);
float strokeWidth = 8f;
bvs.getRenderContext().setVertexShapeTransformer(new ConstantTransformer(new Ellipse2D.Float(-24,-24,48,48)));
bvs.getRenderContext().setArrowDrawPaintTransformer(new ConstantTransformer(Color.black));
bvs.getRenderContext().setEdgeStrokeTransformer(new ConstantTransformer(new BasicStroke(strokeWidth)));
bvs.getRenderContext().setEdgeArrowStrokeTransformer(new ConstantTransformer(new BasicStroke(strokeWidth)));
bvs.getRenderContext().setEdgeLabelTransformer(new ToStringLabeller<E>());
bvs.getRenderContext().setVertexLabelTransformer(new ToStringLabeller<V>());
bvs.setPreferredSize(viewSize);
//int width = bvs.getWidth(); // Always returns zero
int width = viewFrame.getWidth();
//int height = bvs.getHeight(); // Always returns zero
int height = viewFrame.getHeight();
BufferedImage bim = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = bim.createGraphics();
viewFrame.paintAll(g); …Run Code Online (Sandbox Code Playgroud) 我正在为 scala 项目使用 java 线性代数库(ojalgo 32.0),并且遇到了一个奇怪的问题。我使用过的每个 ojalgo 方法都工作得很好(例如,矩阵和元素乘法、逆矩阵和随机矩阵生成),除了两个看似简单的获取矩阵维度的方法。我以前在调用 java 库时从未遇到过任何问题,而且我很好奇发生了什么。下面是 java 中的一些示例代码,运行良好:
public static void main(String[] arg) {
MatrixFactory tmpFactory = PrimitiveMatrix.FACTORY;
BasicMatrix wMat = tmpFactory.makeRandom(5,5,new Weibull(5.0, 2.0));
System.out.println(wMat.getColDim());
}
Run Code Online (Sandbox Code Playgroud)
对 scala 的简单翻译(使用版本 2.9.2):
object DataGen {
def main(args:Array[String]):Unit = {
val tmpFactory = PrimitiveMatrix.FACTORY
val wMat = tmpFactory.makeRandom(5,5,new Weibull(5.0, 2.0))
println(wMat.getColDim)
}
Run Code Online (Sandbox Code Playgroud)
scala 代码抛出这样的错误:
Exception in thread "main" java.lang.IllegalAccessError: tried to
access class org.ojalgo.access.Structure2D from class DataGen$
at DataGen$.main(DataGen.scala:11)
at DataGen.main(DataGen.scala)
Run Code Online (Sandbox Code Playgroud)
11号线是
println(wMat.getColDim).
Run Code Online (Sandbox Code Playgroud)
搜索此错误的其他情况表明 scala 中存在一些已知的访问错误问题,但我仍然不确定问题的原因或最干净的解决方法可能是什么。
我有一个方法,探索不同类函数的不同参数值.以前,我做了一些非类型安全的运行时检查,其中,擦除后,所有重要的是我使用的是Function2而不是Function3.我正在尝试使用ClassTags/TypeTag更安全一点,但我仍然在努力寻找一个好的解决方案.我原来的参考点是tksfz的回答:
如何在Scala上绕过类型擦除?或者,为什么我不能获得我的集合的类型参数?
import reflect.ClassTag
def matchList[A: ClassTag](list: List[A]) = list match {
case strlist: List[String] => println("A list of strings!")
case intlist: List[Int] => println("A list of ints!")
case _ => println("Ok")
}
Run Code Online (Sandbox Code Playgroud)
但是,我发现给定的代码段不起作用,并且两种情况都匹配一个字符串列表 - 可能是答案涉及不同版本的scala(我使用的是2.10.3).
我找到了另一个例子,其中有人使用TypeTags给出了一个片段(我对类型标签类型之间的差异仍然有些模糊;我很乐意在这一点上进行RTFM响应,前提是它伴随着一个好的M到FR的链接).
编辑:我之前的例子没有应用函数,因此产生警告的匹配部分毫无意义(正如第一个回答者指出的那样).我已经更新了示例,以便更能代表我的实际问题.
package misc
import reflect.runtime.universe._
object CTDemo {
def main(args: Array[String]) = {
val f0v: Function2[Int, Double, String] = f0(_, _)
val f1v: Function2[Int, (Double, Double), String] = f1(_, _)
println(matchFunc(f0v))
println(matchFunc(f1v))
}
def f0(i: Int, p: Double) = {
s"output on …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用play 2.4.2从anorm迁移到slick,并获得配置错误:
play.api.Configuration$$anon$1: Configuration error[Cannot connect to database [dethcs]]
at play.api.Configuration$.configError(Configuration.scala:178) ~[play_2.11-2.4.0.jar:2.4.0]
...
Caused by: slick.SlickException: Error getting instance of Slick driver "slick.driver.MySQLDriver"
...
Caused by: java.lang.NoSuchMethodException: slick.driver.MySQLDriver.<init>()
Run Code Online (Sandbox Code Playgroud)
以前我在SO上发现的答案都集中在拥有正确的MySQL驱动程序和其他依赖项.我相信我的build.sbt涵盖了相关的基础,包括:
libraryDependencies += "mysql" % "mysql-connector-java" % "5.1.36"
libraryDependencies += "com.typesafe.play" %% "play-slick" % "1.0.1"
libraryDependencies += "com.typesafe.play" %% "play-slick-evolutions" % "1.0.1"
Run Code Online (Sandbox Code Playgroud)
我的application.conf中的相关行是:
slick.dbs.dethcs.db.driver="com.mysql.jdbc.Driver"
slick.dbs.dethcs.driver="slick.driver.MySQLDriver"
slick.dbs.dethcs.user="redacted"
slick.dbs.dethcs.db.url="jdbc:mysql://localhost/mydb"
slick.dbs.dethcs.password="redacted"
Run Code Online (Sandbox Code Playgroud)
我很感激有关如何解决这个问题的任何建议 - 我猜它是愚蠢的但是我发现很难获得特定于最新版本的光滑的文档和示例 - 并且可以提供附加信息,如果这将有所帮助.
java ×2
scala ×2
image ×1
jung ×1
matlab ×1
mysql ×1
performance ×1
sbt ×1
scala-2.10 ×1
slick-3.0 ×1