相关疑难解决方法(0)

gprof 的替代品

还有哪些程序与 gprof 做同样的事情?

profiler profiling gprof

170
推荐指数
6
解决办法
7万
查看次数

为什么python中的字符串比较如此之快?

当我解决以下示例算法问题时,我很好奇理解字符串比较在python中如何工作的内部:

给定两个字符串,返回最长公共前缀的长度

解决方案1:charByChar

我的直觉告诉我,最佳解决方案是在两个单词的开头用一个光标开始并向前迭代,直到前缀不再匹配.就像是

def charByChar(smaller, bigger):
  assert len(smaller) <= len(bigger)
  for p in range(len(smaller)):
    if smaller[p] != bigger[p]:
      return p
  return len(smaller)
Run Code Online (Sandbox Code Playgroud)

为了简化代码,该函数假定第一个字符串的长度smaller始终小于或等于第二个字符串的长度bigger.

解决方案2:binarySearch

另一种方法是将两个字符串平分以创建两个前缀子字符串.如果前缀相等,我们知道公共前缀点至少与中点一样长.否则,公共前缀点至少不大于中点.然后我们可以递归以找到前缀长度.

阿卡二进制搜索.

def binarySearch(smaller, bigger):
  assert len(smaller) <= len(bigger)
  lo = 0
  hi = len(smaller)

  # binary search for prefix
  while lo < hi:
    # +1 for even lengths
    mid = ((hi - lo + 1) // 2) + lo

    if smaller[:mid] == bigger[:mid]:
      # prefixes equal
      lo = mid
    else: …
Run Code Online (Sandbox Code Playgroud)

python x86 interpreter cpython strncmp

34
推荐指数
1
解决办法
1639
查看次数

运行多个python程序时的高内核CPU

我开发了一个python程序,可以进行繁重的数值计算.我在具有32个Xeon CPU,64GB RAM和64位Ubuntu 14.04的Linux机器上运行它.我并行启动具有不同模型参数的多个python实例以使用多个进程,而不必担心全局解释器锁(GIL).当我使用监视cpu利用率时htop,我看到所有核心都被使用,但大部分时间都是由内核使用的.通常,内核时间是用户时间的两倍以上.我担心系统级别会有很多开销,但我无法找到原因.

如何降低高内核CPU使用率?

以下是我做的一些观察:

  • 此效果与我是否运行10个作业或50无关.如果作业数少于核心数,则不会使用所有核心,但使用的核仍然具有内核的高CPU使用率
  • 我使用numba实现了内部循环,但问题与此无关,因为删除numba部分无法解决问题
  • 我也认为它可能与使用类似于这个SO问题中提到的问题的 python2 有关但是从python2切换到python3没有太大变化
  • 我测量了OS执行的上下文切换总数,大约是每秒10000次.我不确定这是否是一个很大的数字
  • 我尝试通过设置sys.setcheckinterval(10000)(对于python2)和sys.setswitchinterval(10)(对于python3)增加python时间片,但这没有一个帮助
  • 我尝试通过运行影响任务调度程序,schedtool -B PID但这没有帮助

编辑: 以下是截图htop: 在此输入图像描述

我也跑了perf record -a -g,这是报告perf report -g graph:

Samples: 1M of event 'cycles', Event count (approx.): 1114297095227                                   
-  95.25%          python3  [kernel.kallsyms]                           [k] _raw_spin_lock_irqsave   ?
   - _raw_spin_lock_irqsave                                                                          ?
      - 95.01% extract_buf                                                                           ?
           extract_entropy_user                                                                      ?
           urandom_read                                                                              ?
           vfs_read                                                                                  ?
           sys_read                                                                                  ?
           system_call_fastpath                                                                      ?
           __GI___libc_read                                                                          ?
-   2.06% …
Run Code Online (Sandbox Code Playgroud)

python linux performance multiprocessing

14
推荐指数
1
解决办法
1855
查看次数

从perf获取用户空间堆栈信息

我正在尝试在我正在测试的PostgreSQL构建中跟踪一些幻像I/O. 它是一个多进程服务器,将磁盘I/O关联回特定的后端和查询并不简单.

我认为Linux的perf工具对此非常理想,但我正在努力捕获块I/O性能计数器指标并将它们与用户空间活动相关联.

通过以下方式记录块I/O请求和完成很容易:

sudo perf record -g -T -u postgres -e 'block:block_rq_*'
Run Code Online (Sandbox Code Playgroud)

并且记录了用户空间pid,但是没有捕获内核或用户空间堆栈,或者能够对用户空间进程堆的快照位(例如,查询文本)等进行快照.所以当你有pid时,你就不会我知道那个过程在那一点上做了什么.只是perf script输出,如:

postgres  7462 [002] 301125.113632: block:block_rq_issue: 8,0 W 0 () 208078848 + 1024 [postgres]
Run Code Online (Sandbox Code Playgroud)

如果我向其添加-g标志,perf record则会获取内核堆栈的快照,但不会捕获内核中捕获的perf事件的用户空间状态.用户空间堆只上升到从用户空间,如入口点LWLockRelease,LWLockAcquire,memcpy(mmap'd IO),__GI___libc_write

所以.有小费吗?能够捕获用户空间堆栈的快照以响应内核事件将是理想的.

我在Fedora 19,3.11.3-201.fc19.x86_64,Schrödinger的Cat,使用perf版本3.10.9-200.fc19.x86_64.

c linux linux-kernel perf

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

基准测试 - 如何计算发送到 CPU 的指令数以查找消耗的 MIPS

假设我有一个软件,并且想要使用黑盒方法研究其行为。我有一个 3.0GHz CPU,有 2 个插槽和 4 个核心。如您所知,为了找出每秒指令数 (IPS),我们必须使用以下公式:

IPS = sockets*(cores/sockets)*clock*(instructions/cycle)
Run Code Online (Sandbox Code Playgroud)

首先,我想找到我的特定算法每个周期的指令数。然后我意识到使用块盒方法几乎不可能计算它,我需要对算法进行深入分析。

但现在,我有两个问题:无论我的机器上运行什么类型的软件及其CPU使用率,有没有办法计算每秒发送到CPU的指令数(每秒百万条指令(MIPS))?是否有可能找到指令集的类型(添加、比较、输入、跳转等)?

任何脚本或工具推荐都将受到赞赏(任何语言)。

cpu performance benchmarking assembly profiling

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

与C / C ++最相关的性能指标

我正在寻找相关的性能指标来基准测试和优化我的C / C ++代码。例如,虚拟内存使用率是一个简单但有效的指标,但是我知道有些虚拟内存使用情况更为专业,可以帮助优化特定域:高速缓存命中/未命中,上下文切换等。

我相信这里是一个列出性能指标,衡量指标以及如何衡量指标的好地方,以帮助希望开始优化程序的人员知道从何开始。

cpu optimization performance benchmarking profiling

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