这是一个用于测试NME针对不同构建(Windows c ++,Flash)的像素级操作性能的小项目.
它用于BitmapData.setPixel逐个修改像素(每帧320x240).的c + +在22 FPS建立运行,并且闪光建立围绕〜100 FPS.是什么原因导致C++版本与闪存相比性能大幅下降?如何使用C++构建改进代码以获得更高的FPS?
import nme.display.Sprite;
import nme.display.Bitmap;
import nme.display.BitmapData;
import nme.text.TextField;
import nme.events.Event;
import nme.events.TimerEvent;
import nme.utils.Timer;
import nme.geom.Matrix;
import nme.geom.Rectangle;
import nme.utils.ByteArray;
class Mandelbrot
{
public static function main() : Void
{
new Mandelbrot();
}
public var pixels:Array<Array<Int>>;
public var colorModifier:Int;
private var bitmapData:BitmapData;
private var bigBitmapData:BitmapData;
private var fps:TextField;
private var width:Int;
private var height:Int;
private var matrix:Matrix;
public function new()
{
width = 320; //Std.int(flash.Lib.current.stage.stageWidth/2); …Run Code Online (Sandbox Code Playgroud) 我找不到关于@async宏的详细文档.从关于并行性的文档中我了解到,在Julia进程中只使用了一个系统线程,并且在yieldto函数的帮助下有明确的任务切换- 如果我错了,请纠正我.
对我来说,很难理解这些任务切换只是通过查看代码来实现,并且知道它何时发生似乎至关重要.
据我所知yieldto,代码中的某个地方(或代码调用的某个函数)需要确保系统不会只停留在一个任务中.
例如,当存在read操作时,在读取内部可能存在wait调用,并且在执行中wait可能存在yieldto调用.我认为没有yieldto电话,代码就会卡在一个任务中; 但是运行以下示例似乎证明了这个假设是错误的.
@async begin # Task A
while true
println("A")
end
end
while true # Task B
println("B")
end
Run Code Online (Sandbox Code Playgroud)
此代码生成以下输出
BA
BA
BA
...
Run Code Online (Sandbox Code Playgroud)
我很不清楚@async在上面的代码中由宏创建的任务内部发生任务切换的位置.
如何查看代码中发生任务切换的点?
Gecko是Firefox的渲染引擎.使用gecko-sharp可以将其嵌入到任何Mono/GTK#程序中.有一个名为GladeSharpBrowser的示例应用程序用于执行此操作.我可以设法使用修改后的项目文件来构建它,但它正在崩溃.这可以帮助您重现问题:
我使用了SharpDevelop 3.0和一个教程来安装我的Mono 2.2.我确保它使用ProcMon调用Mono的gmcs进行编译.设置SharpDevelop后,必须修改BrowserSharp.csproj,以便与Mono一起编译.
还有一条警告信息:
发现同一依赖程序集的不同版本之间存在冲突.
这很奇怪,因为所有组件都是由Mono提供的组件.
当然,还有其他方法,如GeckoFX,但我特别感兴趣的是使用Mono以独立于平台的方式进行.
var a = ImmutableList<int>.Empty.Add(1).Add(2).Add(3);
var b = ImmutableList<int>.Empty.Add(1).Add(2).Add(3);
Console.WriteLine(a.Equals(b)); // False
Run Code Online (Sandbox Code Playgroud)
在上面的代码a.Equals(b)调用中Object.Equals,因为ImmutableList<T>没有覆盖Equals(object),并且ImmutableList<T>引用类型Object.Equals会(无用的)引用比较。
问题:为什么不ImmutableList<T>覆盖.Equals?将每个包含的对象与每个包含的对象进行比较.Equals并根据这些比较返回结果将是直接的并且期望。测试框架的其余部分甚至是一致的(请参阅 参考资料class String)
注意:上面的代码是用 System.Collections.Immutable.1.1.38-beta-23516
当安装System.Collections.ImmutableNuGet下载程序集时System.Runtime,即使我已经使用.NET 4.6.1安装了该程序集.
此外,lib下的目录(如packages\System.Runtime.4.0.0\lib \net45)不包含dll文件,只包含空文件_._.
为什么会这样?为什么这有必要?我在这里错过了什么?
NuGet日志:
Install-Package System.Collections.Immutable -Version 1.1.37
Attempting to gather dependency information for package 'System.Collections.Immutable.1.1.37' with respect to project 'ConsoleApplication1', targeting '.NETFramework,Version=v4.6.1'
Attempting to resolve dependencies for package 'System.Collections.Immutable.1.1.37' with DependencyBehavior 'Lowest'
Resolving actions to install package 'System.Collections.Immutable.1.1.37'
Resolved actions to install package 'System.Collections.Immutable.1.1.37'
GET https://www.nuget.org/api/v2/package/System.Collections/4.0.0
Installing System.Collections 4.0.0.
Adding package 'System.Collections.4.0.0' to folder 'd:\workspace\ConsoleApplication1\packages'
Added package 'System.Collections.4.0.0' to folder 'd:\workspace\ConsoleApplication1\packages'
Added package 'System.Collections.4.0.0' to 'packages.config'
Successfully installed 'System.Collections …Run Code Online (Sandbox Code Playgroud) using System;
public delegate void Printer(string s);
class Program
{
public static void Main(string[] args)
{
Printer p = new Printer(delegate {});
p+= myPrint;
p("Hello");
Console.ReadKey(true);
}
public static void myPrint(string s)
{
System.Console.WriteLine(s);
}
}
Run Code Online (Sandbox Code Playgroud)
好像我必须使用空的匿名函数初始化一个委托才能+=以后使用.当我省略该new条款时,它p会成为null并且+=不起作用,这是有道理的.
现在,当我有一个带有委托实例的类时,我可以执行以下操作:
using System;
public delegate void Printer(string s);
class Program
{
public static void Main(string[] args)
{
A a = new A();
a.p += myPrint;
a.p("Hello");
Console.ReadKey(true);
}
public static void myPrint(string s) …Run Code Online (Sandbox Code Playgroud) c# ×4
.net ×2
asynchronous ×1
delegates ×1
gecko ×1
haxe ×1
immutability ×1
julia ×1
mono ×1
nuget ×1