小编Alb*_*ymk的帖子

JVM JIT方法重新计算纯方法

使用jmh对以下Java代码进行基准测试:

interface MyInterface {
    public int test(int i);
}

class A implements MyInterface {
    public int test(int i) {
        return (int)Math.sin(Math.cos(i));
    }
}

@State(Scope.Thread)
public class MyBenchmark {
    public MyInterface inter;

    @Setup(Level.Trial)
    public void init() {
        inter = new A();
    }

    @Benchmark
    public void testMethod(Blackhole sink) {
        int[] res = new int[2];
        res[0] = inter.test(1);
        res[1] = inter.test(1);
        sink.consume(res);
    }
}
Run Code Online (Sandbox Code Playgroud)

使用mvn package && java -XX:-UseCompressedOops -XX:CompileCommand='print, *.testMethod' -jar target/benchmarks.jar -wi 10 -i 1 -f 1,我是能够得到大会,如果我们着眼于从C2的一个(如下图所示),我们可以看到,无论是 …

java assembly jit jvm jmh

7
推荐指数
1
解决办法
189
查看次数

Groovy 闭包不适用于超类的静态最终字段

class Parent {
    final static String newLine = "*"
}
class Child extends Parent{
    List body = [3, 4, 5]
    String toString() {
        def str = new StringBuilder()
        body.each { str.append(it + newLine) }
        str
    }
}

def c = new Child()
println c
Run Code Online (Sandbox Code Playgroud)

以上是说明问题的一个简单示例。无法使用Groovy pluginon编译它Eclipse。去掉任一finalstatic域中的超类就解决了这个问题。但是,我不知道为什么会这样。

http://groovy.codehaus.org/Groovy+Beans 在这个链接中,它提到了 Groovy 中使用的属性和字段的规则。我想应用的应该是最后一个,即元类。不幸的是,我仍然无法理解这种行为。

该行为在所有版本的 Groovy 中一致重现。也许有人可以向 Groovy 团队报告一个错误。我以前从未这样做过。如果有经验的人可以这样做,效率会更高。

groovy static closures final

5
推荐指数
1
解决办法
1750
查看次数

理解空c程序的strace输出

int main(int argc, char *argv[])
{
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

鉴于上面的C程序,我得到以下输出使用clang test.c ; strace ./a.out.

execve("./a.out", ["./a.out"], [/* 36 vars */]) = 0
brk(0)                                  = 0x1a06000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f785c40f000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=78590, ...}) = 0
mmap(NULL, 78590, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f785c3fb000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 …
Run Code Online (Sandbox Code Playgroud)

linux strace

5
推荐指数
1
解决办法
370
查看次数

为什么<sys/types.h>中的uint使用-std = c99消失?

// Filename: test.c
#include <sys/types.h>
int main() {
    uint a;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码能够使用gcc和clang编译,标准如gnu89或gnu99.换句话说,以下工作.

$gcc test.c # for the default is std=gnu89
$clang test.c # for the default is std=gnu99
Run Code Online (Sandbox Code Playgroud)

但是,以下错误导致错误"未声明的uint".

$gcc -std=c99 test.c
$clang -std=c99 test.c
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么uint的定义在c99标准中消失了吗?

c standards c99

4
推荐指数
1
解决办法
2001
查看次数

为什么编译器是用C/C++编写的,而不是使用CoffeeScript(JavaScript,Node JS)?

由于嵌入式系统编程,我接触到C,我认为这是该领域的一种优秀语言.但是,为什么它用于编写编译器?如果在C/C++中实现gcc的原因是当时没有很多好的语言,那么为什么clang采用相同的路径(使用C/C++)没有任何借口.

是出于性能原因吗?与编译语言相比,大多数解释语言都有点慢,但我认为由于Node.js,CoffeeScript(JavaScript)中的差异几乎可以忽略不计.

从开发人员的角度来看,我认为使用高级语言编写一个编译器要容易得多.不幸的是,大多数编译器都是用C/C++编写的.是仅仅因为遗留代码?

回复评论:

  • Bootstrapping只是一种说明这种语言足以编写一个编译器的方法.它不应该是我们选择语言来实现编译器的主要原因.

  • 我同意下面给出的猜测,"大多数编译器开发人员都会回答,因为大多数编译器相关工具(bison,yacc)都会发出C代码".但是,GCC和Clang都没有使用生成的解析器,他们自己实现了一个.这个前端流程独立于目标架构,不应该是C/C++的优势.

  • 或多或少的共识是,绩效是一个关键因素.实际上,即使对于GCC和Clang来说,构建合理大小的C项目(Linux内核)也需要花费大量时间.是因为前端还是后端.我必须承认,我在编译器的后端方面没有太多经验,因为我们完成了使用生成的LLVM代码的编译器课程.

c compiler-construction node.js

4
推荐指数
1
解决办法
3381
查看次数

内存屏障:软件黑客的硬件视图示例 3

我正在从原始论文“内存屏障:软件黑客的硬件视图”中复制该图的文本。

\n
\n

表 4 显示了由 CPU 0、1 和 2 同时执行的三个代码片段。所有变量最初都为零。

\n

请注意,CPU 1 和 CPU 2 都无法继续执行第 5 行,直到它们在第 3 行看到 CPU 0\xe2\x80\x99s 分配给 \xe2\x80\x9cb\xe2\x80\x9d。一旦 CPU 1 和 2 执行了它们的如果第 4 行上有内存屏障,它们都保证能看到第 2 行内存屏障之前的 CPU 0 的所有分配。同样,第 8 行上的 CPU 0\xe2\x80\x99s 内存屏障与第 8 行上的 CPU 1 和 2 的内存屏障配对4,这样CPU 0不会执行第9行对\xe2\x80\x9ce\xe2\x80\x9d的赋值,直到它对\xe2\x80\x9ca\xe2\x80\x9d的赋值对两个CPU都可见之后其他CPU。因此,第 9 行的 CPU 2\xe2\x80\x99s 断言保证不会触发。

\n
\n

在此输入图像描述

\n

对我来说,CPU0 上的第 6-9 行似乎根本没有必要,因为 CPU 0 的第 2 行的内存屏障和 CPU 1&2 的第 4 行的内存屏障保证了 的效果被b=1拾取,并且之前的所有存储也是如此a=1。然后,断言e …

memory-barriers

4
推荐指数
1
解决办法
971
查看次数

clang和gcc与复合文字的不同行为

最近遇到了复合文字,据我所知,以下是使用它的正确方法.幸运的是,它适用于ubuntu上的gcc和clang.

int main() {
  int *p = (int []) {1, 2};
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,我注意到使用复合文字的另一种方法,如下所示.感觉有点奇怪; 这只是数组初始化器.下面的代码用clang编译好,但是用gcc编译失败了array initialized from non-constant array expression.

int main() {
  int p[] = (int []) {1, 2};
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是故意还是什么?

ENV:

  • gcc(Ubuntu 4.8.2-19ubuntu1)4.8.2
  • Ubuntu clang版本3.5-1ubuntu1(主干)(基于LLVM 3.5)

CMD:

  • gcc test.c
  • clang test.c

c gcc c99 clang compound-literals

3
推荐指数
1
解决办法
532
查看次数

当handle_call返回noreply时,erlang otp gen_server会丢弃连接

启动服务器使用:

erlc server.erl ; erl -eval 'server:start()'
Run Code Online (Sandbox Code Playgroud)

在另一个终端:

telnet localhost 3547
Run Code Online (Sandbox Code Playgroud)

哪个可以成功建立连接,但在几秒钟内,由于我之外的原因,服务器关闭了连接.阅读该文档handle_call/3,{noreply, NewState}被允许为好.

有人可以解释一下吗?感觉超级混乱我.

源代码

-module(server).
-mode(compile).
-behavior(gen_server).

-compile(export_all).

-export([   main/1
          , start/0
          , stop/0
          , stop_and_wait/0
        ]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
        terminate/2, code_change/3]).

-define(SERVER, ?MODULE).
-define(DEFAULT_PORT, 3547).

-record(state, {port, lsock}).

start_link(Port) ->
  gen_server:start_link({local, ?SERVER}, ?MODULE, [Port], []).

start() ->
  start_link(?DEFAULT_PORT).

stop() ->
  gen_server:cast(?SERVER, stop).

stop_and_wait() ->
  gen_server:call(?SERVER, stop, infinity).

init([Port]) ->
  {ok, LSock} = gen_tcp:listen(Port, [{active, false}, {reuseaddr, true}]),
  {ok, #state{port = Port, lsock = …
Run Code Online (Sandbox Code Playgroud)

erlang erlang-otp

2
推荐指数
1
解决办法
148
查看次数

整数和字符串的racket to-string函数

需要编写一个to-string接受整数和字符串的函数.

(to-string 3) ; -> "3"
(to-string "hello") ; -> "\"hello\""
(to-string "hel\"lo") ; -> "\"hel\\\"lo\""
Run Code Online (Sandbox Code Playgroud)

我设法这样做:

(define (to-string x)
  (define o (open-output-string))
  (write x o)
  (define str (get-output-string o))
  (get-output-bytes o #t)
  str
  )
(to-string 3)
(to-string "hello")
(to-string "hel\"lo")
Run Code Online (Sandbox Code Playgroud)

但是,get-output-bytes重置不是很易读.什么是惯用的球拍方式呢?

racket

1
推荐指数
2
解决办法
1734
查看次数

vim删除不存在的映射

背景场景:当我调试一个VimScript时,某些代码不会被执行.原因是unmap引发了一个错误,VimScript退出此错误.因为代码周围有一个空的try-catch,所以问题不是很明显.在最终找到问题之后,我开始认为这个默认行为可能不是很直观.

这是一些简单的代码,用于说明vim报告在实验上删除不存在的映射时出错.它会在最后一行失败,说是"E31:没有这样的映射".

map <F10> :echo 'hello'
unmap <F10>
unmap <F10>
Run Code Online (Sandbox Code Playgroud)

不幸的是,我找不到关于这种行为的任何文档.有人能指出我在哪里可以解释删除不存在的映射吗?这个设计背后的理性是什么?就个人而言,我会认为删除不存在的映射是一个正常的声明,并像往常一样继续.

编辑:这个问题可能存在一些误解.我不是问如何抑制错误.我想知道为什么vim认为删除一个不存在的映射是一个错误.这么严重吗?

正如答案和评论中所指出的那样,当它可以执行操作时,引发一个错误是unix哲学.我完全同意它,但在shell中,脚本默认继续出错,因此不应该应用相同的推理.

PS:正如推荐的那样,这个问题已经转移到了vim-dev.

mapping vim

-5
推荐指数
1
解决办法
800
查看次数