我正在研究memchr类似函数的性能并做了一个有趣的观察.
这是check.c通过3种实现来查找\n字符串中字符的偏移量:
#include <stdlib.h>
size_t mem1(const char *s)
{
const char *p = s;
while (1)
{
const char x = *p;
if (x == '\n') return (p - s);
p++;
}
}
size_t mem2(const char *s)
{
const char *p = s;
while (1)
{
const char x = *p;
if (x <= '$' && (x == '\n' || x == '\0')) return (p - s);
p++;
}
}
size_t mem3(const char *s) …Run Code Online (Sandbox Code Playgroud) 我正在阅读https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin#GitPlugin-AdvancedFeatures,它允许在将提交提交到主分支之前预构建功能分支,从而有效地实现预提交构建/测试队列.
它说Using Git, Jenkins and pre-build branch merging:
设置Jenkins项目,并将Git SCM中的"分支"字段留空.这将导致Jenkins考虑对任何分支进行任何更改以进行构建.
接下来,选择一个特定的分支名称作为"高级"部分中的集成目标 - (例如"master"或"stable"),然后选择"构建前合并".
从构建后操作中选择"将GIT标记推回原始存储库"(这需要使用构建结果更新集中式git存储库).
现在,开发人员不应该直接提交到您的集成分支('master'或'stable').相反,他们应该使用功能分支,或者在提交时创建新的远程分支(例如:"git push origin HEAD:refs/heads/myNewFeature").您还可以将GIT存储库设置为仅接受来自Jenkins的集成分支的提交.
你完成了.提交现在应该自动与集成分支合并(如果它们没有干净地合并,它们将失败)并构建.如果构建成功,则合并的结果将被推回到远程git存储库.
现在我经常有我想要继续开发的功能分支,并且只能将它们合并到master以后.
据我了解,此设置将合并并在构建后立即推送任何功能分支master.
(如何)Jenkins可以支持我的用例,构建所有功能分支,但只合并那些master我要合并的那些吗?
可以说我有这个程序
{-# LANGUAGE GADTs #-}
data My a where
A :: Int -> My Int
B :: Char -> My Char
main :: IO ()
main = do
let x = undefined :: My a
case x of
A v -> print v
-- print x
Run Code Online (Sandbox Code Playgroud)
编译好.
但当我评论时print x,我得到:
gadt.hs: line 13, column 12:
Couldn't match type ‘a0’ with ‘()’
‘a0’ is untouchable
inside the constraints (a1 ~ GHC.Types.Int)
bound by a pattern with constructor
Main.A :: GHC.Types.Int …Run Code Online (Sandbox Code Playgroud) 我已经在过去注意到nix,一个./myfile.txt路径类型似乎
/home/myuser/mydir/myfile.txt,和/nix/store/55j24v9qwdarikv7kd3lc0pvxdr9r2y8-myfile.txt.我想知道究竟何时发生这种情况.
这对于包含任何形式的秘密信息的文件尤为重要,因为/nix/store系统中的所有用户都可以读取所有文件.
(使用时nixops,为此目的有一个特殊的"键"功能,请参阅本手册中的管理键部分,但我认为这种路径到存储路径复制nix本身和如何发生的时间和方式仍然很重要.)
该程序每行打印65k字节.
我测量吞吐量./a.out | pv >/dev/null并达到3 GB/s左右.
一旦我将线路长度更改为70k,吞吐量就会下降到~1 GB/s.
我在这里遇到了哪个瓶颈(CPU缓存,libc idiosynchrasy等)?
#include <stdio.h>
#include <string.h>
#define LEN 65000 // high throughput
// #define LEN 70000 // low throughput
int main ()
{
char s[LEN]; memset(s, 'a', LEN-1); s[LEN-1] = '\0';
while (1)
printf ("%s\n", s);
}
Run Code Online (Sandbox Code Playgroud)
更新:我在Core i5-2520M上运行64位Ubuntu 12.04,它有EGLIBC 2.15.
更新: puts (s)有同样的问题.
我想在我已经完成并想要发送到上游项目的分支上签署所有提交(例如,通过GitHub上的pull请求).
我发现的推荐方法是使用
git rebase -i [base-commit]
# Set all commits to "edit"
git commit --amend --signoff # do this for all commits
Run Code Online (Sandbox Code Playgroud)
如何在一个非交互式命令中自动执行此操作?
跟进为什么ELF执行入口点虚拟地址为0x80xxxxx而不是0x0?和为什么Linux程序的虚拟内存地址为0x8048000开始?,为什么我不能ld使用与默认值不同的入口点ld -e?
如果我这样做,我会得到一个segmentation fault返回代码139,即使对于默认入口点附近的地址.为什么?
编辑:
我会更具体地提出这个问题:
.text
.globl _start
_start:
movl $0x4,%eax # eax = code for 'write' system call
movl $1,%ebx # ebx = file descriptor to standard output
movl $message,%ecx # ecx = pointer to the message
movl $13,%edx # edx = length of the message
int $0x80 # make the system call
movl $0x0,%ebx # the status returned by 'exit'
movl $0x1,%eax # eax = code for …Run Code Online (Sandbox Code Playgroud) 我有一个Nix包,我想捆绑到一个docker容器中.
具体来说,我想使用Nix作为更具表现力的替代方案,Dockerfile以获得更快(非线性)的图像构建.
我已经找到了文档,dockerTools.buildImage但我想有一个最小的工作示例,我也想知道最终存在于docker容器中的内容.
在Haskell中,是否存在数据类型的情况
{-# LANGUAGE BangPatterns #-}
import Control.DeepSeq
data D = D Int
Run Code Online (Sandbox Code Playgroud)
实例
instance NFData D where
rnf (D !_) = ()
Run Code Online (Sandbox Code Playgroud)
可以与具有另一个外部的实例具有不同的效果!:
instance NFData D where
rnf !(D !_) = ()
Run Code Online (Sandbox Code Playgroud)
我的研究:
let绑定(如此答案),我认为不适用于函数模式匹配这样.https://prime.haskell.org/wiki/BangPatterns#Thebasicidea说
只有在变量或外卡模式之前,爆炸才真正有效
和
在强迫评估的模式之前发出一声巨响无论如何都没有
而且我想
rnf (D _) 无论如何已经迫使评估
rnf x = case x of D _ -> ...rnf !(D _)会产生同样的效果rnf (D _)rnf !(D !_)必须具有相同的效果rnf (D !_)所以我认为不,这两个总是相同的 …
我iperf在两台服务器之间运行测量,通过10Gbit链路连接.我试图将我观察到的最大窗口大小与系统配置参数相关联.
特别是,我观察到最大窗口大小为3 MiB.但是,我在系统文件中找不到相应的值.
通过运行sysctl -a我得到以下值:
net.ipv4.tcp_rmem = 4096 87380 6291456
net.core.rmem_max = 212992
Run Code Online (Sandbox Code Playgroud)
第一个值告诉我们最大接收器窗口大小为6 MiB.但是,TCP倾向于分配两倍的请求大小,因此最大接收器窗口大小应为3 MiB,正如我测量的那样.来自man tcp:
请注意,TCP实际上分配的次数是setsockopt(2)调用中请求的缓冲区大小的两倍,因此后续的getsockopt(2)调用将不会返回与setsockopt(2)调用中请求的缓冲区大小相同的缓冲区.TCP使用额外空间用于管理目的和内部内核结构,并且/ proc文件值反映了与实际TCP窗口相比更大的大小.
但是,第二个值net.core.rmem_max表示最大接收器窗口大小不能超过208 KiB.根据以下情况,这应该是硬限制man tcp:
tcp_rmem max:每个TCP套接字使用的接收缓冲区的最大大小.该值不会覆盖全局值
net.core.rmem_max.这不用于限制在套接字上使用SO_RCVBUF声明的接收缓冲区的大小.
那么,为什么我会观察到最大窗口大小大于指定的窗口大小net.core.rmem_max?
注意:我还计算了带宽 - 延迟产品:window_size = Bandwidth x RTT大约3 MiB(10 Gbps @ 2毫秒RTT),从而验证我的流量捕获.
performance ×3
c ×2
git ×2
haskell ×2
nix ×2
assembly ×1
benchmarking ×1
caching ×1
docker ×1
elf ×1
gadt ×1
git-commit ×1
git-rebase ×1
iperf ×1
jenkins ×1
linker ×1
linux ×1
nixos ×1
printf ×1
tcp ×1