我有两个Seq[Array[Byte]]
数组:
var o1: Seq[Array[Byte]]
var o2: Seq[Array[Byte]]
//...
Run Code Online (Sandbox Code Playgroud)
我需要改变o1
数组的Seq,这样如果数组的长度非零,则每个数组都o1
被替换o2
为相同位置的数组.o2
是否有可能与理解?
我有一个整数
int a = //...
Run Code Online (Sandbox Code Playgroud)
int
java中的s由4个字节组成.如果我们将其转换为short
,我们将采用两个最不重要的字节.什么是最快的方法来short
组成2个最重要byte
的int
?
short b = //take two most significant bytes of a
Run Code Online (Sandbox Code Playgroud) 我有一个关于合并的问题。目前尚不清楚它的副作用。我有以下RDD:
JavaRDD<String> someStrings = //...
JavaRDD<String> coalescedStrings = someStrings.coalesce(100, false); //descreasing
Run Code Online (Sandbox Code Playgroud)
那么,实际发生了什么?如果我进行someStrings
一些操作会影响coalescedStrings
吗?
我对ScalaZ提供的monad转换器印象深刻,现在对是否有可能OptionT
在Java中实现类似功能感到惊讶?
在Scala中,我们可以使用TypeClass
es来简化实现。Java中有类似的东西吗?
我正在尝试匿名映射内存页面。就这个:
mov rax, 0x09 ; SYS_mmap
mov rdi, 0x00 ; addr is NULL
mov rsi, 0x8000 ; x86 page_size
mov rdx, 0x02 ; PROT_WRITE
mov r10, 0x20 ; MAP_ANONYMOUS
mov r8, -1 ; fd = -1
mov r9, 0x00 ; offset = 0
syscall
mov [rax], dword -2 ; Segmentation fault, rax = -22
Run Code Online (Sandbox Code Playgroud)
这是SegFaulted。但是当我添加MAP_PRIVATE
到标志时,它可以正常工作:
mov rax, 0x09 ; SYS_mmap
mov rdi, 0x00 ; addr is NULL
mov rsi, 0x8000 ; x86 page_size
mov rdx, 0x02 ; PROT_WRITE …
Run Code Online (Sandbox Code Playgroud) 我试图添加元素List[String]
一会儿省略烦人的括号.我试过这个:
object Main extends App {
val l = List("fds")
val xs1: List[String] = l.+:("123") // ok
val xs2: List[String] = l +: "123" // compile-error
}
Run Code Online (Sandbox Code Playgroud)
为什么省略括号导致编译错误?这些任务看起来和我一样.有什么不同?
我在阅读有关scalaz并注意到,我们可以让列表Applicative
s到是Applicative
的List
.
def sequenceA[F[_]: Applicative, A](list: List[F[A]]): F[List[A]] = list match {
case Nil => (Nil: List[A]).point[F]
case x :: xs => (x |@| sequenceA(xs)) {_ :: _}
}
Run Code Online (Sandbox Code Playgroud)
问题是我们可以做相反的事吗?我们可以改造F[List[A]]
成List[F[A]]
?
我正在测量一些单线程方法调用(用 Scala 编写)并想要分析基准测试。这是它的样子(省略了实现细节)
@State(Scope.Benchmark)
class TheBenchmarks {
var data: Array[Byte] = _
@Param(Array("1024", "2048", "4096", "8192"))
var chunkSize: Int = _
@Setup
def setup(): Unit = {
data = //get the data
}
@Benchmark
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@BenchmarkMode(Array(Mode.AverageTime))
def takeFirstAvroRecord(bh: Blackhole): Unit = {
val fr = //do computation with data and chunk size
bh.consume(fr)
}
}
Run Code Online (Sandbox Code Playgroud)
好吧,我得到了一些结果并想理解它,但 -prof perfasm
我有点不清楚它的输出。首先:
....[Hottest Regions]...............................................................................
44.20% 40.50% runtime stub StubRoutines::jbyte_disjoint_arraycopy (205 bytes)
6.78% 1.62% C2, level 4 cats.data.IndexedStateT$$Lambda$21::apply, version 1242 (967 bytes)
4.39% 0.79% …
Run Code Online (Sandbox Code Playgroud) 我试图了解DirectByteBuffer
Linux 上的工作原理并编写了以下非常简单的程序以在 strace 下运行:
public static void main(String[] args){
while(true){
ByteBuffer buffer = ByteBuffer.allocateDirect(8192);
}
}
Run Code Online (Sandbox Code Playgroud)
我期望实际上一些mmap
或sys_brk
系统调用直接从操作系统分配内存,但实际上它只是设置了请求页面的读写保护。我的意思是这样的:
mprotect(0x7fa9681ef000, 8192, PROT_READ|PROT_WRITE) = 0
Run Code Online (Sandbox Code Playgroud)
这似乎是分配直接缓冲区比分配堆缓冲区慢的原因,因为每次分配都需要系统调用。
如果我错了,请纠正我,但堆缓冲区分配(如果发生在 TLAB 内)相当于返回一个指向预分配堆内存的指针。
问题:为什么我们不能对直接内存做同样的事情?返回一个指向预分配内存的指针?
java ×5
scala ×4
jvm ×2
apache-spark ×1
applicative ×1
assembly ×1
bytebuffer ×1
int ×1
jmh ×1
linux ×1
list ×1
mercurial ×1
monads ×1
scala-cats ×1
scalaz ×1
short ×1
tortoisehg ×1
x86-64 ×1