Skip to content

Commit 6589165

Browse files
committed
testing speed
1 parent 317f466 commit 6589165

File tree

3 files changed

+108
-24
lines changed

3 files changed

+108
-24
lines changed

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/ColumnDataHolder.kt

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,19 @@
22

33
package org.jetbrains.kotlinx.dataframe
44

5+
import org.jetbrains.kotlinx.dataframe.impl.columns.BOOLEAN
6+
import org.jetbrains.kotlinx.dataframe.impl.columns.BYTE
7+
import org.jetbrains.kotlinx.dataframe.impl.columns.CHAR
58
import org.jetbrains.kotlinx.dataframe.impl.columns.ColumnDataHolderImpl
9+
import org.jetbrains.kotlinx.dataframe.impl.columns.DOUBLE
10+
import org.jetbrains.kotlinx.dataframe.impl.columns.FLOAT
11+
import org.jetbrains.kotlinx.dataframe.impl.columns.INT
12+
import org.jetbrains.kotlinx.dataframe.impl.columns.LONG
13+
import org.jetbrains.kotlinx.dataframe.impl.columns.SHORT
14+
import org.jetbrains.kotlinx.dataframe.impl.columns.UBYTE
15+
import org.jetbrains.kotlinx.dataframe.impl.columns.UINT
16+
import org.jetbrains.kotlinx.dataframe.impl.columns.ULONG
17+
import org.jetbrains.kotlinx.dataframe.impl.columns.USHORT
618
import org.jetbrains.kotlinx.dataframe.impl.columns.ofCollection
719
import org.jetbrains.kotlinx.dataframe.impl.columns.ofBoxedArray
820
import org.jetbrains.kotlinx.dataframe.impl.columns.ofPrimitiveArray
@@ -45,37 +57,37 @@ public inline fun <reified T> Array<T>.toColumnDataHolder(distinct: Lazy<Set<T>>
4557
this.toColumnDataHolder(typeOf<T>(), distinct)
4658

4759
public fun BooleanArray.asColumnDataHolder(distinct: Lazy<Set<Boolean>>? = null): ColumnDataHolder<Boolean> =
48-
ColumnDataHolder.ofPrimitiveArray(this, typeOf<Boolean>(), distinct)
60+
ColumnDataHolder.ofPrimitiveArray(this, BOOLEAN, distinct)
4961

5062
public fun ByteArray.asColumnDataHolder(distinct: Lazy<Set<Byte>>? = null): ColumnDataHolder<Byte> =
51-
ColumnDataHolder.ofPrimitiveArray(this, typeOf<Byte>(), distinct)
63+
ColumnDataHolder.ofPrimitiveArray(this, BYTE, distinct)
5264

5365
public fun ShortArray.asColumnDataHolder(distinct: Lazy<Set<Short>>? = null): ColumnDataHolder<Short> =
54-
ColumnDataHolder.ofPrimitiveArray(this, typeOf<Short>(), distinct)
66+
ColumnDataHolder.ofPrimitiveArray(this, SHORT, distinct)
5567

5668
public fun IntArray.asColumnDataHolder(distinct: Lazy<Set<Int>>? = null): ColumnDataHolder<Int> =
57-
ColumnDataHolder.ofPrimitiveArray(this, typeOf<Int>(), distinct)
69+
ColumnDataHolder.ofPrimitiveArray(this, INT, distinct)
5870

5971
public fun LongArray.asColumnDataHolder(distinct: Lazy<Set<Long>>? = null): ColumnDataHolder<Long> =
60-
ColumnDataHolder.ofPrimitiveArray(this, typeOf<Long>(), distinct)
72+
ColumnDataHolder.ofPrimitiveArray(this, LONG, distinct)
6173

6274
public fun FloatArray.asColumnDataHolder(distinct: Lazy<Set<Float>>? = null): ColumnDataHolder<Float> =
63-
ColumnDataHolder.ofPrimitiveArray(this, typeOf<Float>(), distinct)
75+
ColumnDataHolder.ofPrimitiveArray(this, FLOAT, distinct)
6476

6577
public fun DoubleArray.asColumnDataHolder(distinct: Lazy<Set<Double>>? = null): ColumnDataHolder<Double> =
66-
ColumnDataHolder.ofPrimitiveArray(this, typeOf<Double>(), distinct)
78+
ColumnDataHolder.ofPrimitiveArray(this, DOUBLE, distinct)
6779

6880
public fun CharArray.asColumnDataHolder(distinct: Lazy<Set<Char>>? = null): ColumnDataHolder<Char> =
69-
ColumnDataHolder.ofPrimitiveArray(this, typeOf<Char>(), distinct)
81+
ColumnDataHolder.ofPrimitiveArray(this, CHAR, distinct)
7082

7183
public fun UByteArray.asColumnDataHolder(distinct: Lazy<Set<UByte>>? = null): ColumnDataHolder<UByte> =
72-
ColumnDataHolder.ofPrimitiveArray(this, typeOf<UByte>(), distinct)
84+
ColumnDataHolder.ofPrimitiveArray(this, UBYTE, distinct)
7385

7486
public fun UShortArray.asColumnDataHolder(distinct: Lazy<Set<UShort>>? = null): ColumnDataHolder<UShort> =
75-
ColumnDataHolder.ofPrimitiveArray(this, typeOf<UShort>(), distinct)
87+
ColumnDataHolder.ofPrimitiveArray(this, USHORT, distinct)
7688

7789
public fun UIntArray.asColumnDataHolder(distinct: Lazy<Set<UInt>>? = null): ColumnDataHolder<UInt> =
78-
ColumnDataHolder.ofPrimitiveArray(this, typeOf<UInt>(), distinct)
90+
ColumnDataHolder.ofPrimitiveArray(this, UINT, distinct)
7991

8092
public fun ULongArray.asColumnDataHolder(distinct: Lazy<Set<ULong>>? = null): ColumnDataHolder<ULong> =
81-
ColumnDataHolder.ofPrimitiveArray(this, typeOf<ULong>(), distinct)
93+
ColumnDataHolder.ofPrimitiveArray(this, ULONG, distinct)

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/impl/columns/ColumnDataHolderImpl.kt

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -74,18 +74,18 @@ internal class ColumnDataHolderImpl<T>(private val list: List<T>, distinct: Lazy
7474
override fun iterator(): Iterator<T> = list.iterator()
7575
}
7676

77-
private val BOOLEAN = typeOf<Boolean>()
78-
private val BYTE = typeOf<Byte>()
79-
private val SHORT = typeOf<Short>()
80-
private val INT = typeOf<Int>()
81-
private val LONG = typeOf<Long>()
82-
private val FLOAT = typeOf<Float>()
83-
private val DOUBLE = typeOf<Double>()
84-
private val CHAR = typeOf<Char>()
85-
private val UBYTE = typeOf<UByte>()
86-
private val USHORT = typeOf<UShort>()
87-
private val UINT = typeOf<UInt>()
88-
private val ULONG = typeOf<ULong>()
77+
internal val BOOLEAN = typeOf<Boolean>()
78+
internal val BYTE = typeOf<Byte>()
79+
internal val SHORT = typeOf<Short>()
80+
internal val INT = typeOf<Int>()
81+
internal val LONG = typeOf<Long>()
82+
internal val FLOAT = typeOf<Float>()
83+
internal val DOUBLE = typeOf<Double>()
84+
internal val CHAR = typeOf<Char>()
85+
internal val UBYTE = typeOf<UByte>()
86+
internal val USHORT = typeOf<UShort>()
87+
internal val UINT = typeOf<UInt>()
88+
internal val ULONG = typeOf<ULong>()
8989

9090
/**
9191
* Constructs [ColumnDataHolderImpl] using an [asList] wrapper around the [collection].
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package org.jetbrains.kotlinx.dataframe.columns
2+
3+
import org.jetbrains.kotlinx.dataframe.DataColumn
4+
import org.jetbrains.kotlinx.dataframe.api.dataFrameOf
5+
import org.jetbrains.kotlinx.dataframe.api.filter
6+
import org.jetbrains.kotlinx.dataframe.columns.ColumnDataHolder.ColumnType.BOXED_ARRAY
7+
import org.jetbrains.kotlinx.dataframe.columns.ColumnDataHolder.ColumnType.DOUBLE_ARRAY
8+
import org.jetbrains.kotlinx.dataframe.columns.ColumnDataHolder.ColumnType.LIST
9+
import org.junit.Test
10+
import kotlin.random.Random
11+
import kotlin.time.Duration
12+
import kotlin.time.measureTime
13+
14+
class ColumnDataHolder {
15+
16+
enum class ColumnType {
17+
LIST,
18+
BOXED_ARRAY,
19+
DOUBLE_ARRAY,
20+
}
21+
22+
@Test
23+
fun `measuring speed of ColumnDataHolder creation`() {
24+
val size = 50_000
25+
val content = { i: Int -> Random.nextDouble() }
26+
val tests = buildList {
27+
repeat(2_000) {
28+
add(LIST)
29+
add(BOXED_ARRAY)
30+
add(DOUBLE_ARRAY)
31+
}
32+
}.shuffled()
33+
34+
val results = mapOf(
35+
LIST to mutableListOf<Duration>(),
36+
BOXED_ARRAY to mutableListOf(),
37+
DOUBLE_ARRAY to mutableListOf(),
38+
)
39+
40+
for (test in tests) {
41+
val time = measureTime {
42+
val df = when (test) {
43+
LIST -> dataFrameOf(
44+
DataColumn.createValueColumn("a", List(size, content)),
45+
DataColumn.createValueColumn("b", List(size, content)),
46+
)
47+
48+
BOXED_ARRAY -> dataFrameOf(
49+
DataColumn.createValueColumn("a", Array(size, content)),
50+
DataColumn.createValueColumn("b", Array(size, content)),
51+
)
52+
53+
DOUBLE_ARRAY -> dataFrameOf(
54+
DataColumn.createValueColumn("a", DoubleArray(size, content)),
55+
DataColumn.createValueColumn("b", DoubleArray(size, content)),
56+
)
57+
}
58+
59+
df.filter { "a"<Double>() > "b"<Double>() }
60+
}
61+
62+
results[test]!!.add(time)
63+
}
64+
65+
println("Results:")
66+
results.forEach { (type, times) ->
67+
println("$type: ${times.mean()}")
68+
}
69+
}
70+
71+
fun Collection<Duration>.mean(): Duration = reduce { acc, duration -> acc + duration } / size
72+
}

0 commit comments

Comments
 (0)