Tag: 性能

为什么Clojure在clojure.lang.Iterate.first上花了这么多时间?

我很喜欢关于弗兰克·纳尔逊·科尔 ( Frank Nelson Cole)的故事,他在1903年在一个着名的“没有文字的讲座”中展示了2 ^ 67 – 1的主因式分解。 这些天使用下面的朴素算法可以很容易地找到分解: (def mersenne67 (dec (expt 2 67))) (->> (iterate inc 2) (filter #(zero? (rem mersenne67 %))) (first)) 但是我注意到这个Clojure代码大约需要等效的Java或Kotlin代码的两倍。 (在我的机器上〜40 vs〜20秒) 我把这个Java比较为: public static BigInteger mersenne() { BigInteger mersenne67 = BigInteger.valueOf(2).pow(67).subtract(BigInteger.ONE); return Stream.iterate(BigInteger.valueOf(2), (x -> x.add(BigInteger.ONE))) .filter(x -> mersenne67.remainder(x).equals(BigInteger.ZERO)) .findFirst() .get(); } 重写低级Clojure代码没有任何区别: (def mersenne67 (-> (BigInteger/valueOf […]

不能使用具有委派属性的自定义getter

我是kotlin新手,无法弄清楚这个问题。 我有一个不可空的财产,可能会或可能不会使用。 因此,我已经委派了一个懒惰的方式,以便在需要时进行初始化。 private val labelAnimator: ObjectAnimator by lazy { ObjectAnimator.ofFloat(this, "floatingLabelFraction", 0f, 1f) } 但是,我也需要在每次访问时设置该对象的某些属性。 fun getLabelAnimator(): ObjectAnimator { labelAnimator.duration = (if (isFloatingLabelAnimating) 300 else 0).toLong() return labelAnimator } 但是我不能使用自定义的getter,因为这个属性是委托的。 我如何以最好的方式实现这一点?

我怎样才能得到一个函数测试Kotlin函数性能的时间

我需要检查一个函数需要运行多久。 我有以下功能解决相同的任务: mixAnimalsA fun mixAnimalsA(a1: Animal, a2: Animal) = when (setOf(a1, a2)) { setOf(Animal.OWL, Animal.Leopard) -> Beast.OWLPARD setOf(Animal.ELEPHANT, Animal.BUTTERFLY) -> Beast.BUTTERPHANT else -> throw Exception("Not possible combination") } mixAnimalsB fun mixAnimalsB(a1: Animal, a2: Animal) = when (setOf(a1, a2)) { (c1 == Animal.OWL && c2 == Animal.Leopard) || (c2 == Animal.OWL && c1 == Animal.Leopard) -> […]

如何实现从某个特定源获取的属性直到它直接在Kotlin中设置?

我目前有一个属性声明如下: class Foo(val base : FooBase){ var _number: Int? = null override var number: Int get() = _number ?: base.number set(value) {_number = value} } 不过,我有很多像这样的属性,导致了很多代码的重复。 有没有办法避免这种情况? 我明白财产代表团是这样做的一种方式,但我不确定如何正确实施ReadWriteProperty<…> 。 如果我应该使用它,我该如何使用“财产”价值?

Observable属性允许在运行时添加观察者

通过Delegates.observable ,Kotlin允许可观察的属性。 但是,我需要在运行时添加观察者的能力,就像Java的Observable类一样。 我现在拥有的是: import java.util.* import kotlin.reflect.KProperty import kotlin.reflect.KProperty0 import kotlin.reflect.jvm.isAccessible class MyObservable<T> (var v: T): java.util.Observable() { operator fun getValue(thisRef: Any, prop: KProperty<*>) = v operator fun setValue(thisRef: Any, prop: KProperty<*>, newValue: T) { v = newValue setChanged() notifyObservers() } } fun <T> addObserver(prop: KProperty0<T>, observerFn: (T) -> Unit) = (prop.apply{ isAccessible = […]

为什么Gradle构建的Kotlin源代码暂停〜3秒“强制System.gc()”?

每个构建需要额外的3-4秒,在日志输出打印以下后立即暂停。 [LIFECYCLE] [org.jetbrains.kotlin.gradle.plugin.KotlinGradleBuildServices]强制System.gc() 为什么要“强迫”呢? 我如何避免这种情况,加快我的构建?

Kotlin:大量的ConsPStack,我该如何避免?

我如何避免由我的应用程序创建的大量ConsPStack ? 什么时候创建? 我的申请: https : //github.com/Jire/Abendigo

Kotlin:避免创建FqNameUnsafe和FqName

我注意到我的应用程序创建了大量的FqNameUnsafe和FqName实例。 什么时候创建? 我怎样才能避免这些创造? (我需要减少我的应用程序中的垃圾创建。)

Kotlin可变属性的扩展函数

我试图设置一个可变属性的扩展函数,所以我可以在扩展函数中重新分配属性。 我想知道这是否可能。 我的目标是使Date扩展易于访问。 例如: fun Date.addDays(nrOfDays: Int): Date { val cal = Calendar.getInstance() cal.time = this cal.add(Calendar.DAY_OF_YEAR, nrOfDays) return cal.time } 此函数使用Calendar对象将日期数添加到日期。 问题是每次我必须返回一个新的日期,每次使用这个函数都可能会造成混乱。 我试过了: fun KMutableProperty0<Date>.addDays(nrOfDays: Int) { val cal = Calendar.getInstance() cal.time = this.get() cal.add(Calendar.DAY_OF_YEAR, nrOfDays) this.set(cal.time) } 不幸的是,这不能用于Date对象。 可以这样做吗?

Kotlin没有领域的吸气二传手

我想创建一个没有领域的getter和setter。 目前我有这个功能: /** Only the color component will be considered, alpha has no effect */ fun setCircleColor(@ColorInt color : Int){ circlePaint.color = ColorUtils.setAlphaComponent(color, circlePaint.alpha) } 理想情况下,我想有这样的事情 circleColor: @ColorInt Int get(){ return circlePaint.color set(value){ circlePaint.color = ColorUtils.setAlphaComponent(color, circlePaint.alpha) } 正如你所看到的,我不想在一个var中存储circleColor,但是能够调用 myView.color = 0xFFaaaaaa而不是myView.setColor(0xFFaaaaaa) 。 这可能吗?