当我解决以下示例算法问题时,我很好奇理解字符串比较在python中如何工作的内部:
给定两个字符串,返回最长公共前缀的长度
我的直觉告诉我,最佳解决方案是在两个单词的开头用一个光标开始并向前迭代,直到前缀不再匹配.就像是
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)
为了简化代码,该函数假定第一个字符串的长度smaller始终小于或等于第二个字符串的长度bigger.
另一种方法是将两个字符串平分以创建两个前缀子字符串.如果前缀相等,我们知道公共前缀点至少与中点一样长.否则,公共前缀点至少不大于中点.然后我们可以递归以找到前缀长度.
阿卡二进制搜索.
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: …我开发了一个python程序,可以进行繁重的数值计算.我在具有32个Xeon CPU,64GB RAM和64位Ubuntu 14.04的Linux机器上运行它.我并行启动具有不同模型参数的多个python实例以使用多个进程,而不必担心全局解释器锁(GIL).当我使用监视cpu利用率时htop,我看到所有核心都被使用,但大部分时间都是由内核使用的.通常,内核时间是用户时间的两倍以上.我担心系统级别会有很多开销,但我无法找到原因.
如何降低高内核CPU使用率?
以下是我做的一些观察:
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% …我正在尝试在我正在测试的PostgreSQL构建中跟踪一些幻像I/O. 它是一个多进程服务器,将磁盘I/O关联回特定的后端和查询并不简单.
我认为Linux的perf工具对此非常理想,但我正在努力捕获块I/O性能计数器指标并将它们与用户空间活动相关联.
通过以下方式记录块I/O请求和完成很容易:
sudo perf record -g -T -u postgres -e 'block:block_rq_*'
并且记录了用户空间pid,但是没有捕获内核或用户空间堆栈,或者能够对用户空间进程堆的快照位(例如,查询文本)等进行快照.所以当你有pid时,你就不会我知道那个过程在那一点上做了什么.只是perf script输出,如:
postgres  7462 [002] 301125.113632: block:block_rq_issue: 8,0 W 0 () 208078848 + 1024 [postgres]
如果我向其添加-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.
假设我有一个软件,并且想要使用黑盒方法研究其行为。我有一个 3.0GHz CPU,有 2 个插槽和 4 个核心。如您所知,为了找出每秒指令数 (IPS),我们必须使用以下公式:
IPS = sockets*(cores/sockets)*clock*(instructions/cycle)
首先,我想找到我的特定算法每个周期的指令数。然后我意识到使用块盒方法几乎不可能计算它,我需要对算法进行深入分析。
但现在,我有两个问题:无论我的机器上运行什么类型的软件及其CPU使用率,有没有办法计算每秒发送到CPU的指令数(每秒百万条指令(MIPS))?是否有可能找到指令集的类型(添加、比较、输入、跳转等)?
任何脚本或工具推荐都将受到赞赏(任何语言)。
我正在寻找相关的性能指标来基准测试和优化我的C / C ++代码。例如,虚拟内存使用率是一个简单但有效的指标,但是我知道有些虚拟内存使用情况更为专业,可以帮助优化特定域:高速缓存命中/未命中,上下文切换等。
我相信这里是一个列出性能指标,衡量指标以及如何衡量指标的好地方,以帮助希望开始优化程序的人员知道从何开始。
performance ×3
profiling ×3
benchmarking ×2
cpu ×2
linux ×2
python ×2
assembly ×1
c ×1
cpython ×1
gprof ×1
interpreter ×1
linux-kernel ×1
optimization ×1
perf ×1
profiler ×1
strncmp ×1
x86 ×1