今日、私はkotlinのnum.inc()機能について学び、それを自分のコードに実装することに決めました。言うまでもなく、それは私のコードに10倍の待ち時間を追加しました(4000 400msの〜から行ってきました+ MS)ここで Kotlin i.inc()はi ++よりも10倍遅いですか?
は私の伝統的な方法での例です(私は++、400msで)ここにあるpackage com.beaudoin
import java.io.BufferedWriter
import java.io.FileInputStream
import java.io.FileWriter
import java.nio.channels.FileChannel
fun main(args: Array<String>) {
val s = System.currentTimeMillis()
val channel = FileInputStream("client.dll").channel
val buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size())
val data = ByteArray(buffer.capacity())
buffer.get(data)
val writer = BufferedWriter(FileWriter("dump.txt", false))
val bytes = ByteArray(16)
var offset = 0
var i = 0
while (i < data.size) {
for (j in bytes.indices) {
bytes[j] = data[i++]
}
writer.write(HexRow(offset, bytes).toString())
writer.newLine()
offset += 16
}
writer.close()
println(System.currentTimeMillis() - s)
}
private val HEX_ARRAY = "ABCDEF".toCharArray()
private val bytes = ByteArray(4);
class HexRow(val offset: Int, val values: ByteArray) {
fun bytesToChar(bytes: ByteArray, width: Int): CharArray {
val hexChars = CharArray((bytes.size * 2) + (bytes.size/width))
for (i in bytes.indices) {
val v = bytes[i].toInt() and 0xFF
val idx = (i * 2) + i/width
hexChars[idx] = HEX_ARRAY[v.ushr(4)]
hexChars[idx + 1] = HEX_ARRAY[v and 0x0F]
if (idx + 2 < hexChars.size) {
hexChars[idx + 2] = ' '
}
}
return hexChars;
}
fun bytesToHex(value: Int) = String(bytesToChar(toByteArray(value), 6))
fun bytesToHex(bytes: ByteArray) = String(bytesToChar(bytes, 1))
fun toByteArray(value: Int): ByteArray {
bytes[0] = value.ushr(24).toByte()
bytes[1] = value.ushr(16).toByte()
bytes[2] = value.ushr(8).toByte()
bytes[3] = value.toByte()
return bytes
}
override fun toString() = bytesToHex(offset) + " " + bytesToHex(values)
}
とコード使用i.inc()(4000ms +)
package com.beaudoin
import java.io.BufferedWriter
import java.io.FileInputStream
import java.io.FileWriter
import java.nio.channels.FileChannel
fun main(args: Array<String>) {
val s = System.currentTimeMillis()
val channel = FileInputStream("client.dll").channel
val buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size())
val data = ByteArray(buffer.capacity())
buffer.get(data)
val writer = BufferedWriter(FileWriter("dump.txt", false))
val bytes = ByteArray(16)
var offset = 0
/* var i = 0
while (i < data.size) {
for (j in bytes.indices) {
bytes[j] = data[i++]
}
writer.write(HexRow(offset, bytes).toString())
writer.newLine()
offset += 16
}*/
for (i in data.indices) {
for (j in bytes.indices) {
bytes[j] = data[i]
i.inc()
}
writer.write(HexRow(offset, bytes).toString())
writer.newLine()
offset += 16
}
writer.close()
println(System.currentTimeMillis() - s)
}
private val HEX_ARRAY = "ABCDEF".toCharArray()
private val bytes = ByteArray(4);
class HexRow(val offset: Int, val values: ByteArray) {
fun bytesToChar(bytes: ByteArray, width: Int): CharArray {
val hexChars = CharArray((bytes.size * 2) + (bytes.size/width))
for (i in bytes.indices) {
val v = bytes[i].toInt() and 0xFF
val idx = (i * 2) + i/width
hexChars[idx] = HEX_ARRAY[v.ushr(4)]
hexChars[idx + 1] = HEX_ARRAY[v and 0x0F]
if (idx + 2 < hexChars.size) {
hexChars[idx + 2] = ' '
}
}
return hexChars;
}
fun bytesToHex(value: Int) = String(bytesToChar(toByteArray(value), 6))
fun bytesToHex(bytes: ByteArray) = String(bytesToChar(bytes, 1))
fun toByteArray(value: Int): ByteArray {
bytes[0] = value.ushr(24).toByte()
bytes[1] = value.ushr(16).toByte()
bytes[2] = value.ushr(8).toByte()
bytes[3] = value.toByte()
return bytes
}
override fun toString() = bytesToHex(offset) + " " + bytesToHex(values)
}
誰かがi.incは()そんなに遅く、私は++よりも、ある理由を教えていただけますか?
PS:でなければなりません(任意のファイルでclient.dllを交換してください〜あなたのコード内で、ここで鉱山への正確な数字を取得したり、単に私のテストファイルをダウンロードするための12メガバイトhere
ああ、それをキャッチしませんでした。ありがとう! –