小编nh2*_*nh2的帖子

为什么我的更复杂的C循环更快?

我正在研究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)

c performance assembly

12
推荐指数
1
解决办法
268
查看次数

如何使用Jenkins预构建分支仅合并我要合并的分支?

我正在阅读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我要合并的那些吗?

git jenkins

12
推荐指数
1
解决办法
1万
查看次数

使用GADT进行类型推断 - a0是不可触及的

可以说我有这个程序

{-# 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)

haskell gadt

12
推荐指数
1
解决办法
631
查看次数

nix路径类型何时进入nix存储区,何时不进入?

我已经在过去注意到nix,一个./myfile.txt路径类型似乎

  • 有时评价为/home/myuser/mydir/myfile.txt,和
  • 有时候/nix/store/55j24v9qwdarikv7kd3lc0pvxdr9r2y8-myfile.txt.

我想知道究竟何时发生这种情况.

这对于包含任何形式的秘密信息的文件尤为重要,因为/nix/store系统中的所有用户都可以读取所有文件.

(使用时nixops,为此目的有一个特殊的"键"功能,请参阅本手册中的管理键部分,但我认为这种路径到存储路径复制nix本身和如何发生的时间和方式仍然很重要.)

nixos nix

12
推荐指数
1
解决办法
892
查看次数

在> 65KB字符串上使用printf命中了哪个瓶颈?

该程序每行打印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)有同样的问题.

c performance benchmarking printf caching

11
推荐指数
1
解决办法
303
查看次数

如何使用git interactive rebase签署一系列提交

我想我已经完成并想要发送到上游项目的分支上签署所有提交(例如,通过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)

如何在一个非交互式命令中自动执行此操作?

git git-rebase git-commit

11
推荐指数
2
解决办法
3170
查看次数

为什么ELF入口点0x8048000不能通过"ld -e"选项更改?

跟进为什么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)

linker elf memory-layout

10
推荐指数
1
解决办法
7295
查看次数

如何使用nix构建docker容器?

我有一个Nix包,我想捆绑到一个docker容器中.

具体来说,我想使用Nix作为更具表现力的替代方案,Dockerfile以获得更快(非线性)的图像构建.

我已经找到了文档,dockerTools.buildImage但我想有一个最小的工作示例,我也想知道最终存在于docker容器中的内容.

docker nix

10
推荐指数
1
解决办法
2087
查看次数

内部爆炸模式总是迫使Haskell中的外部构造者?

在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)

我的研究:

所以我认为不,这两个总是相同的 …

haskell lazy-evaluation

9
推荐指数
1
解决办法
89
查看次数

TCP接收窗口大小高于net.core.rmem_max

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),从而验证我的流量捕获.

linux performance tcp congestion-control iperf

8
推荐指数
2
解决办法
4682
查看次数