我刚刚和朋友讨论了检查std :: string是否只有空格的最有效方法.他需要在他正在进行的嵌入式项目中执行此操作,显然这种优化对他很重要.
我想出了以下代码,它使用了strtok().
bool has_only_spaces(std::string& str)
{
char* token = strtok(const_cast<char*>(str.c_str()), " ");
while (token != NULL)
{
if (*token != ' ')
{
return true;
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找有关此代码的反馈,也欢迎更有效的方法来执行此任务.
我正在寻找替代方法来获取命令行参数argc并argv提供给进程,而无需直接访问传入的变量main().
我想使一类是独立的main(),这样argc并argv没有明确地传递给使用它们的代码.
编辑:有些澄清似乎是有序的.我有这门课.
class Application
{
int const argc_;
char const** const argv_;
public:
explicit Application(int, char const*[]);
};
Application::Application(int const argc, char const* argv[]) :
argc_(argc),
argv_(argv)
{
}
Run Code Online (Sandbox Code Playgroud)
但我想一个默认的构造Application::Application(),有一些(最有可能)的C代码,拉动argc和argv从某处.
我的程序与1.4.2完美搭配.安装完1.5后,我收到以下错误.
import runtime:不使用cgo或SWIG时不允许使用C源文件:atomic_amd64x.c defs.c float.c heapdump.c lfstack.c malloc.c mcache.c mcentral.c mem_linux.c mfixalloc.c mgc0.c mheap. c msize.c os_linux.c panic.c parfor.c proc.c runtime.c signal.c signal_amd64x.c signal_unix.c stack.c string.c sys_x86.c vdso_linux_amd64.c
该错误与程序无关.即使是"Hello world"程序也会抛出相同的错误.
我发现这个主题为什么处理排序数组比未排序数组更快?.并尝试运行此代码.而且我发现了奇怪的行为.如果我使用-O3优化标志编译此代码,则需要2.98605 sec运行.如果我用-O2它编译1.98093 sec.我尝试在同一环境中的同一台机器上运行此代码几次(5或6),我关闭所有其他软件(chrome,skype等).
gcc --version
gcc (Ubuntu 4.9.2-0ubuntu1~14.04) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Run Code Online (Sandbox Code Playgroud)
那么请你能解释一下为什么会这样吗?我阅读gcc手册,我看到-O3包括-O2.谢谢你的帮助.
PS添加代码
#include <algorithm>
#include <ctime>
#include <iostream>
int main()
{
// Generate data
const unsigned arraySize = 32768;
int data[arraySize];
for (unsigned …Run Code Online (Sandbox Code Playgroud) 我想使用类似于C中printf所做的事情来存储格式化的字符串.
char *tmp = (char *)sqlite3_column_text(selectstmt, 2);
const char *sqlAnswers = printf("select key from answer WHERE key = %s LIMIT 5;", tmp);
Run Code Online (Sandbox Code Playgroud)
后者显然是一个错误.
通常的做法是使用CDN缓存javascript,css,font等等...但是这似乎并没有扩展到图标到相同的程度(可能因为每个网站都喜欢具有独特的外观和感觉?)
是否有广泛使用的CDN托管的图标集,这些图标集通常足以从CDN托管中提供显着的速度提升,并且可能已经使用该CDN从另一个站点预先缓存.
一个例子是:http: //cdnjs.cloudflare.com,其内容可浏览https://github.com/cdnjs/cdnjs/tree/master
它主机所在的一些图标集:
/ajax/libs/twitter-bootstrap/2.3.2/img/glyphicons-halflings.png
/ajax/libs/fatcow-icons/...
/ajax/libs/foundicons/3.0.0/svgs/...
/ajax/libs/aui/5.4.0/aui/css/icons/...
/ajax/libs/topcoat-icons/0.2.0/svg/...
/ajax/libs/jqueryui/1.10.3/css/base/images/...
*jqueryui is also hosted on ajax.googleapis.com and others but is a limited set
Run Code Online (Sandbox Code Playgroud)
和bootstrap halflings图标集一样:
http://netdna.bootstrapcdn.com/bootswatch/2.3.2/img/glyphicons-halflings.png
http://ajax.aspnetcdn.com/ajax/bootstrap/2.3.2/img/glyphicons-halflings.png
http://www.bootstrapcdn.com/twitter-bootstrap/2.3.1/img/glyphicons-halflings.png
Run Code Online (Sandbox Code Playgroud) 我有两个数组,a和b,我想计算"min convolution"来产生结果c.简单的伪代码如下所示:
for i = 0 to size(a)+size(b)
c[i] = inf
for j = 0 to size(a)
if (i - j >= 0) and (i - j < size(b))
c[i] = min(c[i], a[j] + b[i-j])
Run Code Online (Sandbox Code Playgroud)
(编辑:更改循环从0开始而不是1)
如果min是一个和,我们可以使用快速傅立叶变换(FFT),但在最小的情况下,没有这样的模拟.相反,我想通过使用GPU(CUDA)尽可能快地制作这个简单的算法.我很乐意找到执行此操作的现有代码(或实现没有FFT的总和情况的代码,以便我可以根据我的目的调整它),但到目前为止我的搜索没有发现任何好的结果.我的用例将涉及大小在1,000到100,000之间的a和b.
问题:
有效执行此操作的代码是否已经存在?
如果我要在结构上自己实现这一点,那么CUDA内核应如何看待以最大限度地提高效率?我尝试过一个简单的解决方案,其中每个c [i]由一个单独的线程计算,但这似乎不是最好的方法.关于如何设置线程块结构和内存访问模式的任何提示?
假设我有一个struct带有固定大小数组成员的C/C++,例如:
#define SIZE 10000
struct foo{
int vector_i[SIZE];
float vector_f[SIZE];
};
Run Code Online (Sandbox Code Playgroud)
我想创建一个函数,它将返回一个实例foo,如:
foo func(int value_i, float value_f){
int i;
foo f;
for(i=0;i<SIZE;i++) f.vector_i[i] = value_i;
for(i=0;i<SIZE;i++) f.vector_f[i] = value_f;
return f;
}
Run Code Online (Sandbox Code Playgroud)
如果我使用以下方法调用函数:
foo ff = func(1,1.1);
Run Code Online (Sandbox Code Playgroud)
编译器会执行某种优化(即TCO)吗?
将可执行填写直接ff变量,或将填补第一f的func,然后所有值从复制f到ff?
如何检查是否执行了优化?
我一直在阅读一些汇编编程视频,以便更好地理解如何手动优化编译后留下的*.s文件.gcc/g++ -S ... 其中一个主题是重构冗余代码,演示如何将冗余代码移动到自己的标记块以ret结束并用呼叫替换它.
视频中给出的示例是2个块,包含:
mov eax,power
mul ebx
mov power,eax
inc count
Run Code Online (Sandbox Code Playgroud)
它取而代之的是call CalculateNextPower和CalculateNextPower看起来像:
CalculateNextPower:
mov eax,power
mul ebx
mov power,eax
inc count
ret
Run Code Online (Sandbox Code Playgroud)
出于好奇,试图减少编译大小,我用-S和各种优化编译了一些C和C++项目,包括-Os,-O2,-O3,-pipe,-combine和-fwhole-program,并分析了结果*.s使用轻微修补(for .s文件)版本的duplo进行冗余的文件.只有-fwhole-program (现已弃用的IIRC)对消除文件中的重复代码有显着影响(我认为它的替换(-s)-flto在链接时会表现相似 - 大致相当于用-ffunction-sections -fdata-sections编译和--gc-sections链接)但仍然错过了大量的代码块.
使用duplo输出的手动优化导致随机C项目的大小减少约10%,并且当仅具有至少5个连续重复指令的连续块组件被重复数据删除时,随机C++项目中几乎减少30%.
我是否遗漏了一个编译器选项(甚至是一个独立的工具),在编译大小时会自动消除冗余程序集(包括其他编译器:clang,icc等等) 或者是否缺少此功能(原因?)?
如果它不存在,则可以修改duplo以忽略以'.'开头的行.要么 ';' (以及其他人?)并使用重复代码调用函数替换重复的代码块,但我对其他可直接使用编译器内部表示(最好是clang或gcc)的建议持开放态度.
编辑:我修补杜普洛识别重复组装块在这里,但它仍然需要在此刻手动重构.只要使用相同的编译器生成代码,就可以(但可能很慢)识别最大的重复代码块,将它们放在自己的"函数"块中,并用CALL替换代码到该块.
我找不到如何在PHP中编写空的Python结构/字典.当我在PHP中编写"{}"时,它给了我一个错误.Python字典的等效php编程结构是什么?
我有一个简单的问题,假设我有以下代码,并且它以类似的方式重复10次,例如.
if blah then
number = number + 2^n
end if
Run Code Online (Sandbox Code Playgroud)
评估会更快吗?
number = number + blah*2^n?
Run Code Online (Sandbox Code Playgroud)
这也带来了问题,你可以将一个布尔值乘以一个整数(虽然我不确定从2 ^ n返回的类型,是整数还是unsigned..etc)?(我在Ada工作,但是我们可以尝试概括一下吗?)
编辑:对不起我应该澄清我正在考虑2的力量n,并且我把c放在那里因为我对将来自己的学习感兴趣如果我遇到c中的这个问题并且我认为还有更多的c那些程序员在这些板上然后Ada(我假设你知道这意味着什么),但是我目前的问题是Ada语言,但问题应该是相当语言独立的(我希望).
背景
当我偶然发现gcc trunk中的一个新优化(将是版本9.x)时,我正在使用c中的素数进行操作,该优化将模数比较优化为0整数乘法并使用幻数进行比较.换句话说x%prime==0就变成了x*Magic_mul<=Magic_cmp
_Bool mod(unsigned x){return x % Constant == 0;}
mod:
imul edi, edi, Magic_mul
cmp edi, Magic_cmp
setbe al
Run Code Online (Sandbox Code Playgroud)
细节
基于看到asm输出,它对所有整数进行了这些优化(好吧,至少是素数)我将它们转换为十六进制以帮助查看模式,但目前还不是很明显.
//32bit examples for _Bool mod_n(unsigned x){return x%n==0;};
//note: parameter is unsigned but it becomes a signed multiply
x%3==0; // x*0xAAAAAAAB <= 0x55555555
x%5==0; // x*0xCCCCCCCD <= 0x33333333
x%7==0; // x*0xB6DB6DB7 <= 0x24924924
x%11==0; // x*0xBA2E8BA3 <= 0x1745D174
x%13==0; // x*0xC4EC4EC5 <= 0x13B13B13
x%17==0; // x*0xF0F0F0F1 <= 0x0F0F0F0F
x%19==0; // x*0x286BCA1B <= 0x0D79435E
x%23==0; // …Run Code Online (Sandbox Code Playgroud) 免责声明:以下是纯粹的学术问题; 我将此代码与任何生产系统保持至少100米的距离.这里提出的问题是任何"现实生活"案件都无法衡量的问题.
考虑以下代码(godbolt链接):
#include <stdlib.h>
typedef int (*func_t)(int *ptr); // functions must conform to this interface
extern int uses_the_ptr(int *ptr);
extern int doesnt_use_the_ptr(int *ptr);
int foo() {
// actual selection is complex, there are multiple functions,
// but I know `func` will point to a function that doesn't use the argument
func_t func = doesnt_use_the_ptr;
int *unused_ptr_arg = NULL; // I pay a zeroing (e.g. `xor reg reg`) in every compiler
int *unused_ptr_arg; // UB, gcc zeroes (thanks …Run Code Online (Sandbox Code Playgroud) c ×6
c++ ×4
optimization ×4
gcc ×2
string ×2
struct ×2
ada ×1
assembly ×1
bsd ×1
build ×1
cdn ×1
clang ×1
compilation ×1
convolution ×1
css-sprites ×1
cuda ×1
go ×1
icons ×1
linux ×1
math ×1
modulus ×1
performance ×1
php ×1
posix ×1
python ×1
return-value ×1
size ×1
whitespace ×1
windows ×1