为大型德国公司Future Technologies Group做一些咨询工作我已经向Dart移植了大约6000行Java服务器端软件.这应该有助于回答Dart是否可以有效地在服务器上使用的问题.(由于搜索了为客户端和服务器端编程使用一种语言的优势,这本身将为Dart开绿灯.)
了解Dart(我非常喜欢与之合作)让我期望相对于Java的性能损失为30-50%但是在任何情况下都不会低于100%(慢两倍),这是所提到的决策过程的截止以上.
港口进展顺利.我学到了很多.单元测试很好.但是性能结果非常糟糕......与Java程序相比总体上要慢七倍.
对代码进行概要分析揭示了两个主要原因:数据转换和文件I/O. 也许我做错了什么?在我回到我的客户并取消他们的Dart研究之前,我想搜索一些关于如何改进的建议.让我们从数据转换开始,将原生Dart数据类型转换为各种二进制格式,这些格式可用于有效传输和存储数据.
通常这些转换很简单且非常快,因为实际上没有任何东西可以从使用的内部格式转换而是主要存储在缓冲区中.我创建了一个基准程序,它以某种方式反映了我的程序中这些转换的典型用法:
import 'dart:typed_data';
import 'package:benchmark_harness/benchmark_harness.dart';
// Create a new benchmark by extending BenchmarkBase
class ConversionBenchmark extends BenchmarkBase {
Uint8List result;
ConversionBenchmark() : super("Conversion");
// The benchmark code.
void run() {
const int BufSize = 262144; // 256kBytes
const int SetSize = 64; // one "typical" set of data, gets repeated
ByteData buffer = new ByteData(BufSize);
double doubleContent = 0.0; // used to simulate double content
int intContent = 0; // used to simulate …
Run Code Online (Sandbox Code Playgroud) 我从Github下载了Kotlin Koans,安装了IntelliJ IDEA 2016.1.3并打开了Koans项目.据我所知,我需要Configuration
运行示例.这Configuration
需要一个Main class
.我无法弄清楚我在哪里找到Kotlin Koans的主要课程.我搜索了一个,但没有找到(除了一个特殊的htmlDemo.kt
).
我看到使用了某种单元测试框架.它可能以某种方式调用,task0
但IDE显示没有引用,task0
除了一个来自todoTask0
.唯一的参考todoTask0
是在task0
.所以我们有循环引用,但我找不到外部引用来调用其中一个函数.
有人可以向我解释如何在IntelliJ IDE中运行Kotlin Koans吗?
我正在通过将各种Java程序移植到Dart并对结果进行比较和分析来评估Dart对德国公司的影响.在浏览器中,Dart赢得了胜利.对于服务器软件来说,性能似乎是一个严重的问题(请参阅我的这个问题),但这大部分都被解除了.
现在我正在移植一些"简单"的命令行工具,我根本没想到任何严重的问题,但至少有一个.有些工具会发出HTTP请求来收集一些数据,而独立的Dart虚拟机只能以异步方式支持它们.仔细研究一下,我发现似乎不可能在大多数同步软件中使用任何异步调用.
我知道我可以将可用的同步软件重组为异步软件.但这会将设计良好的软件转换为可读性较低且难以调试和维护的软件.对于某些软件而言,这是没有意义的.我的问题:是否存在(被我忽视)将异步调用嵌入到同步调用方法中的方法?
我想,提供一个系统调用并不困难,只能从主线程中使用,它只是将执行转移到整个排队的异步函数调用列表(不必先结束主线程)并尽快当最后一个执行返回并继续主线程.
可能看起来像这样的东西:
var synchFunction() {
var result;
asyncFunction().then(() { result = ...; });
resync(); // the system call to move to and wait out all async execution
return result;
}
Run Code Online (Sandbox Code Playgroud)
使用这样的方法也可以简化lib API.大多数"同步"调用都可以被删除,因为重新同步调用可以完成这项工作.这似乎是一个合乎逻辑的想法,我仍然认为它存在,我错过了它.或者有一个严重的原因,为什么这不起作用?
lm
(见下文)收到的答案两天之后,我仍然不明白为什么不应该将异步Dart调用封装到同步调用中.它始终在"正常"同步编程世界中完成.通常,您可以通过从异步例程获取"完成"或者在超时后继续失败来等待重新同步.
考虑到这一点,我的第一个提案可以像这样增强:
var synchFunction() {
var result;
asyncFunction()
.then(() { result = ...; })
.whenComplete(() { continueResync() }); // the "Done" message
resync(timeout); // waiting with a timeout as maximum limit
// Either we arrive here with the [result] …
Run Code Online (Sandbox Code Playgroud) 在Webstorm(Windows 7)中的"普通"节点应用程序中,我可以使用console.log
写入Webstorm的控制台窗口.
一旦我使用Electron创建桌面应用程序,虽然我使用相同的节点命令'C:\ Program Files \nodejs \node.exe',但Webstorm控 主要的区别是在运行配置中我必须使用节点参数'C:\ Users\Username\AppData\Roaming \npm \node_modules\electron-prebuilt\cli.js'来获得正确的Electron入口点.
当我从Windows控制台窗口直接启动Electron应用程序时,此控制台窗口将显示所有输出.
问题可能与'cli.js'产生子进程的事实有关:
#!/usr/bin/env node
var electron = require('./')
var proc = require('child_process')
var child = proc.spawn(electron, process.argv.slice(2), {stdio: 'inherit'});
child.on('close', function (code) {
process.exit(code);
})
Run Code Online (Sandbox Code Playgroud)
但是这个继承了stdio
,因此输出应该转到同一个通道.或者我误解了什么?
我正在将一个类从 Java 移植到 Kotlin。这个类声明了数百个对象。每个对象都有一个名称属性,该属性与对象的声明变量名称相同。Java 反射允许通过反射使用声明的名称来设置对象成员name
。只需在数百个构造函数中保存一个参数。
我尝试在 Kotlin 中做同样的事情,但不知道如何进行属性设置。下面是一些简化的测试代码:
import kotlin.reflect.full.companionObject
import kotlin.reflect.full.declaredMemberProperties
class MyTestObject() {
var name: String = "NotInitialized"
companion object {
val Anton = MyTestObject()
val Berta = MyTestObject()
val Caesar = MyTestObject()
}
}
fun main(args : Array<String>) {
println(MyTestObject.Anton.name) // name not yet initialized
// Initialize 'name' with the variable name of the object:
for (member in MyTestObject::class.companionObject!!.declaredMemberProperties) {
if (member.returnType.toString() == "myPackage.MyTestObject") {
println("$member: ${member.name}")
// Set 'name' property to 'member.name':
// ??? …
Run Code Online (Sandbox Code Playgroud) 因为count % 2
我得到了警告
警告:(137,17)Kotlin:'mod(Int):Int'已弃用.请改用rem(其他)
并且Intellij IDE提供了自动更正count.rem(2)
,然后由于未解析的引用而被标记为错误rem
.
我究竟做错了什么?
kotlin ×3
dart ×2
asynchronous ×1
electron ×1
javascript ×1
node.js ×1
performance ×1
reflection ×1
synchronous ×1
webstorm ×1