@inline
final def :=(x
: Float, y
: Float
) = { }
@inline
final def :=(o
: Test
) = { //reassign from arg "o" x = o.x
y = o.y
}
@inline
final def :=(of
: (Test
) => Unit
) = { //apply mutating function "of" }
@inline
final def something
_m
= { //just an example of mutating function that does something x = 42
}
override def toString
() = x.
toString() +
", " + y.
toString() }
@inline
final def benchmark
(name
: String, fun
: () => Any
) = { val t1
= System.
currentTimeMillis() val t2
= System.
currentTimeMillis() name + ": " + (t2 - t1).toFloat / 1000 + "sec; Result:" + res.toString()
}
@inline
final def calc
_something
_for
_reassign
(a
: Float, b
: Float
) = { //Assigns result to temporary object and exposes it (it's also dangerous) tmp := (a, b)
tmp.something_m
tmp
}
@inline
final def calc
_something
_for
_forwarding
(a
: Float, b
: Float
) = { //Creates a function that modifies its argument to the result (result: Test) =>
{
result := (a, b)
result.something_m
}
}
benchmark("reassignment", () => {
i -= 1
v := calc_something_for_reassign(v.x, v.y) //Calculates temporary value and assigns it to `v`
}
v
})
}
benchmark("forwarding", () => {
i -= 1
v := calc_something_for_forwarding(v.x, v.y) //Forwards `v` to mutating function created in right-hand side
}
v
})
}
}
def main
(args
: Array
[String
]) { println(Benchmark.run_a(Int.MaxValue/100))
println(Benchmark.run_b(Int.MaxValue/100))
println(Benchmark.run_b(Int.MaxValue/100))
println(Benchmark.run_a(Int.MaxValue/100))
}
}
Y2xhc3MgVGVzdCh2YXIgeDogRmxvYXQsIHZhciB5OiBGbG9hdCkgewoJQGlubGluZSBmaW5hbCBkZWYgOj0oeDogRmxvYXQsIHk6IEZsb2F0KSA9IHsKCQl0aGlzLnggPSB4CgkJdGhpcy55ID0geQoJfQoJQGlubGluZSBmaW5hbCBkZWYgOj0obzogVGVzdCkgPSB7IC8vcmVhc3NpZ24gZnJvbSBhcmcgIm8iCgkJeCA9IG8ueAoJCXkgPSBvLnkKCX0KCUBpbmxpbmUgZmluYWwgZGVmIDo9KG9mOiAoVGVzdCkgPT4gVW5pdCkgPSB7IC8vYXBwbHkgbXV0YXRpbmcgZnVuY3Rpb24gIm9mIgoJCW9mKHRoaXMpCgl9CglAaW5saW5lIGZpbmFsIGRlZiBzb21ldGhpbmdfbSA9IHsgLy9qdXN0IGFuIGV4YW1wbGUgb2YgbXV0YXRpbmcgZnVuY3Rpb24gdGhhdCBkb2VzIHNvbWV0aGluZwoJCXggPSA0MgoJfQoJb3ZlcnJpZGUgZGVmIHRvU3RyaW5nKCkgPSB4LnRvU3RyaW5nKCkgKyAiLCAiICsgeS50b1N0cmluZygpCn0KCm9iamVjdCBCZW5jaG1hcmsgewoJQGlubGluZSBmaW5hbCBkZWYgYmVuY2htYXJrKG5hbWU6IFN0cmluZywgZnVuOiAoKSA9PiBBbnkpID0gewoJCXZhbCB0MSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpCgkJdmFsIHJlcyA9IGZ1bigpCgkJdmFsIHQyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkKCQluYW1lICsgIjogIiArICh0MiAtIHQxKS50b0Zsb2F0IC8gMTAwMCArICJzZWM7IFJlc3VsdDoiICsgcmVzLnRvU3RyaW5nKCkKCX0KCXZhbCB0bXAgPSBuZXcgVGVzdCgwLCAwKQoJQGlubGluZSBmaW5hbCBkZWYgY2FsY19zb21ldGhpbmdfZm9yX3JlYXNzaWduKGE6IEZsb2F0LCBiOiBGbG9hdCkgPSB7IC8vQXNzaWducyByZXN1bHQgdG8gdGVtcG9yYXJ5IG9iamVjdCBhbmQgZXhwb3NlcyBpdCAoaXQncyBhbHNvIGRhbmdlcm91cykKCQl0bXAgOj0gKGEsIGIpCgkJdG1wLnNvbWV0aGluZ19tCgkJdG1wCgl9CglAaW5saW5lIGZpbmFsIGRlZiBjYWxjX3NvbWV0aGluZ19mb3JfZm9yd2FyZGluZyhhOiBGbG9hdCwgYjogRmxvYXQpID0geyAvL0NyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IG1vZGlmaWVzIGl0cyBhcmd1bWVudCB0byB0aGUgcmVzdWx0CgkJKHJlc3VsdDogVGVzdCkgPT4KCQkJewoJCQkJcmVzdWx0IDo9IChhLCBiKQoJCQkJcmVzdWx0LnNvbWV0aGluZ19tCgkJCX0KCX0KCglAaW5saW5lIGZpbmFsIGRlZiBydW5fYShzcGluczogSW50KSA9IHsKCQl2YWwgeCA9IDJmCgkJdmFsIHkgPSAzZgoJCWJlbmNobWFyaygicmVhc3NpZ25tZW50IiwgKCkgPT4gewoJCQl2YWwgdiA9IG5ldyBUZXN0KHgsIHkpCgkJCXZhciBpID0gc3BpbnMKCQkJd2hpbGUgKGkgPiAwKSB7CgkJCQlpIC09IDEKCQkJCXYgOj0gY2FsY19zb21ldGhpbmdfZm9yX3JlYXNzaWduKHYueCwgdi55KSAvL0NhbGN1bGF0ZXMgdGVtcG9yYXJ5IHZhbHVlIGFuZCBhc3NpZ25zIGl0IHRvIGB2YAoJCQl9CgkJCXYKCQl9KQoJfQoKCUBpbmxpbmUgZmluYWwgZGVmIHJ1bl9iKHNwaW5zOiBJbnQpID0gewoJCXZhbCB4ID0gMmYKCQl2YWwgeSA9IDNmCgkJYmVuY2htYXJrKCJmb3J3YXJkaW5nIiwgKCkgPT4gewoJCQl2YWwgdiA9IG5ldyBUZXN0KHgsIHkpCgkJCXZhciBpID0gc3BpbnMKCQkJd2hpbGUgKGkgPiAwKSB7CgkJCQlpIC09IDEKCQkJCXYgOj0gY2FsY19zb21ldGhpbmdfZm9yX2ZvcndhcmRpbmcodi54LCB2LnkpIC8vRm9yd2FyZHMgYHZgIHRvIG11dGF0aW5nIGZ1bmN0aW9uIGNyZWF0ZWQgaW4gcmlnaHQtaGFuZCBzaWRlCgkJCX0KCQkJdgoJCX0pCgl9Cn0KCm9iamVjdCBNYWluIHsKCWRlZiBtYWluKGFyZ3M6IEFycmF5W1N0cmluZ10pIHsKCQlwcmludGxuKEJlbmNobWFyay5ydW5fYShJbnQuTWF4VmFsdWUvMTAwKSkKCQlwcmludGxuKEJlbmNobWFyay5ydW5fYihJbnQuTWF4VmFsdWUvMTAwKSkKCQlwcmludGxuKEJlbmNobWFyay5ydW5fYihJbnQuTWF4VmFsdWUvMTAwKSkKCQlwcmludGxuKEJlbmNobWFyay5ydW5fYShJbnQuTWF4VmFsdWUvMTAwKSkKCX0KfQ==