小编Nul*_*lik的帖子

是否更快地访问静态或动态分配的内存?

在C中有两种分配全局数组的方法:

  1. 静态

    char data[65536];
    
    Run Code Online (Sandbox Code Playgroud)
  2. 动态

    char *data;
    …
    data = (char*)malloc(65536);  /* or whatever size */
    
    Run Code Online (Sandbox Code Playgroud)

问题是,哪种方法有更好的表现?多少钱?

理解它,第一种方法应该更快.

因为使用第二种方法,要访问数组,每次访问时都必须取消引用元素的地址,如下所示:

  1. 读取data包含指向数组开头的指针的变量
  2. 计算特定元素的偏移量
  3. 访问元素

使用第一种方法,编译器将data变量的地址硬编码到代码中,跳过第一步,因此我们有:

  1. 从编译时定义的固定地址计算特定元素的偏移量
  2. 访问数组的元素

每次存储器访问相当于大约40个CPU时钟周期,因此,使用动态分配,特别是对于不频繁的读取,与静态分配相比可以显着降低性能,因为data可以通过一些更频繁访问的变量从缓存中清除变量.相反,解除引用静态分配的全局变量的成本是0,因为它的地址已经在代码中进行了硬编码.

它是否正确?

c arrays performance

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

优化itoa功能

我正在考虑如何实现将整数(4byte,unsigned)转换为带有SSE指令的字符串.通常的例程是将数字除以并将其存储在局部变量中,然后反转字符串(在此示例中缺少反转例程):

char *convert(unsigned int num, int base) {
    static char buff[33];  

    char *ptr;    
    ptr = &buff[sizeof(buff) - 1];    
    *ptr = '\0';

    do {
        *--ptr="0123456789abcdef"[num%base];
        num /= base;
    } while(num != 0);

    return ptr;
}
Run Code Online (Sandbox Code Playgroud)

但倒置需要额外的时间.是否有任何其他算法可以优先使用SSE指令来并行化该功能?

c optimization

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

划分而不会遗失余数

在C中,是否可以将一个被除数除以常数并同时得到结果和余数?

我想避免执行2个除法指令,如下例所示:

val=num / 10;
mod=num % 10;
Run Code Online (Sandbox Code Playgroud)

c

14
推荐指数
4
解决办法
5402
查看次数

在高可用性环境中升级应用程序

我正在编写NoSQL数据库引擎,我想提供一些功能来帮助开发人员在不停止网站运行的情况下将应用程序升级到新版本,即升级期间0%的停机时间.所以我的问题是,当Web应用程序全天候运行并且经常更改其数据库结构时,它们的方法或一般设计是什么?任何例子或成功案例都将不胜感激.

design-patterns high-availability web-applications

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

我可以在共享库中声明一个全局变量吗?

我可以在库中声明一个全局变量,以后编译成共享对象吗?通过将其声明为extern来从其他库或主应用程序代码引用它是否安全?

理论上它起作用:

[niko@dev1 snippets]$ cat libcode.c 
int variable;   // <-- this is a global variable declared in a Library

void set_var(int value) {
    variable=value;
}
int get_var(void) {
    return variable;
}
[niko@dev1 snippets]$ gcc -g -fPIC -c libcode.c 
[niko@dev1 snippets]$ gcc -o libcode.so -shared libcode.o
[niko@dev1 snippets]$ cat appcode.c 
#include <stdio.h>
// simplified .h declarations:
extern int variable;
void set_var(int value);
int get_var(void);

void main(void) {

    set_var(44);
    printf("var=%d\n",variable);
    variable=33;
    int var_copy=get_var();
    printf("var_copy=%d\n",var_copy);
}
[niko@dev1 snippets]$ gcc -g -o app -L./ …
Run Code Online (Sandbox Code Playgroud)

c

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

如何将文本转换为jsonB

jsonB在Postgres(版本9.6)中将任何文本(或varchar)转换为键入的正确方法是什么?

例如,在这里我使用两种方法,我得到不同的结果:

方法1:

dev=# select '[{"field":15,"operator":0,"value":"1"},{"field":15,"operator":0,"value":"2"},55]'::jsonb;
                                            jsonb                                             
----------------------------------------------------------------------------------------------
 [{"field": 15, "value": "1", "operator": 0}, {"field": 15, "value": "2", "operator": 0}, 55]
(1 row)
Run Code Online (Sandbox Code Playgroud)

方法2,它不会产生预期的结果,顺便说一句:

dev=# select to_jsonb('[{"field":15,"operator":0,"value":"1"},{"field":15,"operator":0,"value":"2"},55]'::text);
                                              to_jsonb                                              
----------------------------------------------------------------------------------------------------
 "[{\"field\":15,\"operator\":0,\"value\":\"1\"},{\"field\":15,\"operator\":0,\"value\":\"2\"},55]"
(1 row)

dev=# 
Run Code Online (Sandbox Code Playgroud)

在这里,它被转换为字符串,而不是数组.为什么第二种方法不能创建数组?

postgresql

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

为linux内核设置cpu亲和力,而不是进程

我很难找到有关如何为Linux内核(包含所有已加载的模块)设置cpu亲和性的信息,而不是针对特定进程.

这是因为我希望内核一直在CPU 0上运行以处理I/O内容,而不是在其他3个CPU上运行任何交换机,因为它可能污染L1和L2缓存.

提前致谢.

Nulik

linux kernel affinity

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

使用gcc生成a.out文件格式

如何在x86架构上使用gcc生成a.out文件格式?

使用nasm,我可以使用-f标志轻松完成此操作,例如:

[user@host]$ nasm -f aout start.asm 
[user@host]$ objdump -a start.o

start.o:     file format a.out-i386-linux
start.o

[user@host]$ 
Run Code Online (Sandbox Code Playgroud)

在linux上,编译.c文件会生成一个elf对象.如何用gcc生成a.out文件?

c executable gcc compilation

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

bss和数据的最大大小

我想在编译时声明我的C程序中的所有变量,例如:

char cache[CACHE_SIZE];
char udp_ring[MAX_UDP_PACKET_SIZE*MAX_REQUESTS];
int  num_packets;
char error_codes[NUM_ERRORS][MAX_ERROR_STRING]= {
    {"Unknown user\n"},
    {"Wrong password\n"},
    ....
};
Run Code Online (Sandbox Code Playgroud)

问题是,当它们进入BSS或DATA段时,C程序中的变量大小是否有任何限制?例如,如果我声明8GB RAM的CACHE_SIZE,它会工作吗?32位或64位有什么区别吗?我打算在Linux上运行程序,我的RLIMIT_DATA配置没有限制.

c linux

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

在不能接受集合的上下文中调用的集合值函数

我收到错误:

在不能接受集合的上下文中调用的集合值函数

RETURN QUERY EXECUTE在行执行此函数时:

PLSQL $ cat lookup_email.pl 
CREATE OR REPLACE FUNCTION app.lookup_email(ident_id bigint,sess bigint,company_id bigint,email varchar)
RETURNS SETOF RECORD as $$
DECLARE
    rec RECORD;
    comp_id bigint;
    server_session bigint;
    schema_name varchar;
    query varchar;
BEGIN
    schema_name:='comp' || company_id;
    select app.session.session into server_session from app.session where app.session.identity_id=ident_id and app.session.session=sess;
    IF FOUND
    THEN
        BEGIN
            query:='SELECT i.email,u.user_id FROM app.identity as i,' || schema_name || '.uzer as u WHERE i.email like ''%' || email || '%'' and i.identity_id=u.identity_id';
            RAISE NOTICE 'executing: %',query;
            RETURN …
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql set-returning-functions

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