小编Nir*_*Nir的帖子

在Emacs中转到文件

在emacs中是否有替代vi"gf"命令?意思是如果实际存在真正的文件名,请尝试立即打开光标下的文件.

谢谢

emacs

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

如何优化C for循环?

我的代码中的瓶颈部分存在性能问题.基本上它是一个简单的嵌套循环.

对问题进行概要分析表明,该程序花费了大量时间来增加循环计数器(++)和终止测试(i/j <8).

观察汇编输出我发现两个计数器都没有得到寄存器,访问它们需要花费很多周期.使用"register"关键字并不能说服编译器将它们实际放入寄存器中.是否可以采取一些措施来优化计数器的访问时间?

这是装配输出.C源只是一个带有i/j计数器的简单嵌套循环.

  2738  0.2479  2459  0.1707   :    1e6c:   jne    1dd1 <process_hooks+0x121>
  1041  0.0942  1120  0.0778   :    1e72:   addl   $0x1,0xffffffd4(%ebp)
  2130  0.1928  2102  0.1459   :    1e76:   cmpl   $0x8,0xffffffd4(%ebp)
  2654  0.2403  2337  0.1622   :    1e7a:   jne    1da0 <process_hooks+0xf0>
  809   0.0732   814  0.0565   :    1e80:   jmp    1ce2 <process_hooks+0x32>
Run Code Online (Sandbox Code Playgroud)

根据要求,这里也是C代码.编译器是gcc btw:

for (byte_index=0; byte_index < MASK_SIZE / NBBY; byte_index++)
{
    if (check_byte(mask,byte_index))
    {
        for (bit_index=0; bit_index < NBBY; bit_index++)
        {
            condition_index = byte_index*NBBY + bit_index;
            if (check_bit(condition_mask,condition_index))
            {
                .
                .
                . …
Run Code Online (Sandbox Code Playgroud)

c compiler-construction optimization

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

在Emacs中定义新的工具提示

我想为emacs添加自定义工具提示.更具体地说,每当我用鼠标悬停在符号(函数/变量)名称上时,我希望看到带有符号定义的工具提示.我知道我可以使用像cscope这样的工具找到这种信息,但我不知道如何将cscope的输出附加到工具提示.有没有人有部分(如何将回调链接到一般的emacs中的工具提示)或完整(我如何实际将cscope的输出链接到工具提示)解决方案呢?

谢谢,Nir

emacs

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

什么是特定场景的最佳Linux内核锁定机制

我需要为这种情况解决锁定问题:

  1. 一个多CPU系统.
  2. 所有CPU都使用通用(软件)资源.
  3. 只读访问资源非常常见.(传入网络数据包的处理)
  4. 写访问频率低得多.(仅限配置更改).

目前我使用的read_lock_bh,write_lock_bh(自旋锁)机制.问题是CPU越多,我在编写器上下文中获得的软锁定就越多.

我阅读了本书中的并发章节,但是在使用自旋锁时,无法理解读者或作者是否会获得优先权.

所以问题是:

  1. Linux自旋锁机制是否优先考虑读者/作者/没有人?
  2. 有没有一种更好的机制可以用来避免我的场景中的那些软锁定,或者在使用我当前的解决方案时,可能是一种让我在编写器获得锁定时优先考虑的方法?

谢谢,Nir

concurrency linux-kernel mutual-exclusion

6
推荐指数
1
解决办法
7479
查看次数

如何使用gstreamer预缓冲传入的网络流?

我正在使用gstreamer通过网络传输音频.我的目标看似简单:将输入流预缓冲到某个时间/字节阈值,然后开始播放.我可能会忽略gstreamer的一个非常简单的功能,但到目前为止,我还没有找到办法做到这一点.

我的(简化)管道如下所示:udpsrc -> alsasink.到目前为止,我实现目标的所有尝试都是在两者之间使用队列元素:

  1. 在两者之间添加队列元素.
  2. 使用该min-threshold-time属性.这实际上有效,但问题是,它使所有传入的数据在队列中花费指定的最小时间,而不仅仅是开头,这不是我想要的.
  3. 为了解决上一个问题,我试图让数据在第一次进入音频接收器时通知我的代码,认为这是取消设置我之前设置的min-time属性的时间,从而实现了"预缓"行为.

这是我尝试的代码的粗略等价物:

def remove_thresh(pad, info, queue):
    pad.remove_data_probe(probe_id)
    queue.set_property("min-threshold-time", 0)

queue.set_property("min-threshold-time", delay)
queue.set_property("max-size-time", delay * 2)
probe_id = audiosink.get_pad("sink").add_data_probe(remove_thresh, queue)
Run Code Online (Sandbox Code Playgroud)

这不起作用有两个原因:

  1. 我的回调比delay我提供的变量更早被调用.
  2. 调用之后,队列中存储的所有数据都将丢失.播放开始,好像队列根本不在那里.

我想我对这件事的运作方式有一个根本的误解.有谁知道我做错了什么,或者可以提供(可能)更好的方法来做到这一点?我在这里使用python,但欢迎使用任何语言的任何解决方案.

谢谢.

python gstreamer

5
推荐指数
1
解决办法
3268
查看次数

在没有memcpy的情况下连接两个内存缓冲区

在CI中有一个函数foo(char*),它接受一个内存指针.在调用者中,我有两个不同的内存缓冲区,我需要连接,所以我可以传递一个指针foo().有没有办法让我这样做而不实际将一个缓冲区复制到另一个缓冲区的末尾而不改变foo()本身?即使两个缓冲区显示为foo()的一个虚拟连续缓冲区

出于性能原因,我需要这个.O(n)解决方案(其中n是缓冲区长度之一)对我的情况是不可接受的.此外,Linux特定的解决方案很好,如果它有帮助.

谢谢.尼尔

c memory-management

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