使用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的一个(如下图所示),我们可以看到,无论是 …
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。去掉任一final或static域中的超类就解决了这个问题。但是,我不知道为什么会这样。
http://groovy.codehaus.org/Groovy+Beans 在这个链接中,它提到了 Groovy 中使用的属性和字段的规则。我想应用的应该是最后一个,即元类。不幸的是,我仍然无法理解这种行为。
该行为在所有版本的 Groovy 中一致重现。也许有人可以向 Groovy 团队报告一个错误。我以前从未这样做过。如果有经验的人可以这样做,效率会更高。
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) // 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,我认为这是该领域的一种优秀语言.但是,为什么它用于编写编译器?如果在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代码的编译器课程.
我正在从原始论文“内存屏障:软件黑客的硬件视图”中复制该图的文本。
\n\n\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
对我来说,CPU0 上的第 6-9 行似乎根本没有必要,因为 CPU 0 的第 2 行的内存屏障和 CPU 1&2 的第 4 行的内存屏障保证了 的效果被b=1拾取,并且之前的所有存储也是如此a=1。然后,断言e …
最近遇到了复合文字,据我所知,以下是使用它的正确方法.幸运的是,它适用于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:
CMD:
启动服务器使用:
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) 需要编写一个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重置不是很易读.什么是惯用的球拍方式呢?
背景场景:当我调试一个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.