在C中有两种分配全局数组的方法:
静态
char data[65536];
Run Code Online (Sandbox Code Playgroud)动态
char *data;
…
data = (char*)malloc(65536); /* or whatever size */
Run Code Online (Sandbox Code Playgroud)问题是,哪种方法有更好的表现?多少钱?
理解它,第一种方法应该更快.
因为使用第二种方法,要访问数组,每次访问时都必须取消引用元素的地址,如下所示:
data
包含指向数组开头的指针的变量使用第一种方法,编译器将data
变量的地址硬编码到代码中,跳过第一步,因此我们有:
每次存储器访问相当于大约40个CPU时钟周期,因此,使用动态分配,特别是对于不频繁的读取,与静态分配相比可以显着降低性能,因为data
可以通过一些更频繁访问的变量从缓存中清除变量.相反,解除引用静态分配的全局变量的成本是0,因为它的地址已经在代码中进行了硬编码.
它是否正确?
我正在考虑如何实现将整数(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中,是否可以将一个被除数除以常数并同时得到结果和余数?
我想避免执行2个除法指令,如下例所示:
val=num / 10;
mod=num % 10;
Run Code Online (Sandbox Code Playgroud) 我正在编写NoSQL数据库引擎,我想提供一些功能来帮助开发人员在不停止网站运行的情况下将应用程序升级到新版本,即升级期间0%的停机时间.所以我的问题是,当Web应用程序全天候运行并且经常更改其数据库结构时,它们的方法或一般设计是什么?任何例子或成功案例都将不胜感激.
我可以在库中声明一个全局变量,以后编译成共享对象吗?通过将其声明为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) 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)
在这里,它被转换为字符串,而不是数组.为什么第二种方法不能创建数组?
我很难找到有关如何为Linux内核(包含所有已加载的模块)设置cpu亲和性的信息,而不是针对特定进程.
这是因为我希望内核一直在CPU 0上运行以处理I/O内容,而不是在其他3个CPU上运行任何交换机,因为它可能污染L1和L2缓存.
提前致谢.
Nulik
如何在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程序中的所有变量,例如:
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配置没有限制.
我收到错误:
在不能接受集合的上下文中调用的集合值函数
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) c ×6
linux ×2
postgresql ×2
affinity ×1
arrays ×1
compilation ×1
executable ×1
gcc ×1
kernel ×1
optimization ×1
performance ×1
plpgsql ×1