我必须测试嵌入式计算机的最极端条件下产生的热量和电流消耗,为此我想编写一个程序,尽可能多地使用CPU资源的四核CPU(每个核心一个线程).你能提出一些非常耗费CPU的东西吗?
我必须在ARMv7上为Linux执行此操作,并且语言是C或C++,我发现的其他示例要么是针对Windows,要么是针对C/C++.
我在我的Windows计算机上尝试这样的东西,显然它正在工作,因为它需要12%的总CPU功率(这是每个核心i7四核2线程):
float x = 1.5f;
while (1)
{
x *= sin(x) / atan(x) * tanh(x) * sqrt(x);
}
Run Code Online (Sandbox Code Playgroud)
我不知道怎么做多线程.
我在SDCC 2.8.0上,因此内存和代码大小非常有限.假设我的输入值介于0到127之间,我想将其缩放到20 - 100.通常我会这样做:
int scale(int input, int min, int max)
{
// assuming max is always greater than min
float range = (float)max - (float)min;
int output = min + int((range / 127.f) * (float)input);
return output;
}
Run Code Online (Sandbox Code Playgroud)
通过呼叫scale(64, 20, 100);我得到60,这正好是20到100之间的一半.
如何在不使用浮点数的情况下完成此操作?任何比特变幻魔术?
假设我有各种数据类型的结构,我想复制向量中的每个字节.我这样做:
vector<unsigned char> myVector; // get a vector
unsigned char buf[sizeof myStructure]; // get an array
memcpy(&buf, &myStructure, sizeof myStructure); // copy struct to array
myVector.insert(myVector.begin(), buf, buf + sizeof myStructure); // copy array to vector
Run Code Online (Sandbox Code Playgroud)
有没有最快的方法允许我将结构复制myStruct到vector myVector而不通过数组buf?
我正在使用正则表达式来分隔HTTP请求的字段:
GET /index.asp?param1=hello¶m2=128 HTTP/1.1
Run Code Online (Sandbox Code Playgroud)
这条路:
smatch m;
try
{
regex re1("(GET|POST) (.+) HTTP");
regex_search(query, m, re1);
}
catch (regex_error e)
{
printf("Regex 1 Error: %d\n", e.code());
}
string method = m[1];
string path = m[2];
try
{
regex re2("/(.+)?\\?(.+)?");
if (regex_search(path, m, re2))
{
document = m[1];
querystring = m[2];
}
}
catch (regex_error e)
{
printf("Regex 2 Error: %d\n", e.code());
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这段代码适用于MSVC,但不适用于GCC 4.8.2(我在Ubuntu Server 14.04上使用).你能否建议使用普通的std :: string运算符分割该字符串的不同方法?
我不知道如何在不同的元素中拆分URL,因为查询字符串分隔符'?' 字符串可能存在也可能不存在.
我有一个std::thread函数调用fopen将一个大文件加载到一个数组中:
void loadfile(char *fname, char *fbuffer, long fsize)
{
FILE *fp = fopen(fname, "rb");
fread(fbuffer, 1, fsize, fp);
flose(fp);
}
Run Code Online (Sandbox Code Playgroud)
这称为:
std::thread loader(loadfile, fname, fbuffer, fsize);
loader.detach();
Run Code Online (Sandbox Code Playgroud)
在某些时候,我的程序中的某些东西想要停止读取该文件并要求另一个文件.问题是,当我删除fbuffer指针时,loader线程仍在继续,并且我得到了一个存在异常的竞争条件.
我该如何杀死那个帖子?我的想法是检查是否存在,fbuffer并可能分成fread小块:
void loadfile(char *fname, char *fbuffer, long fsize)
{
FILE *fp = fopen(fname, "rb");
long ch = 0;
while (ch += 256 < fsize)
{
if (fbuffer == NULL) return;
fread(fbuffer + ch, 1, 256, fp);
}
fclose(fp);
}
Run Code Online (Sandbox Code Playgroud)
这会减慢文件的读取速度吗?你有更好的主意吗?
我在VC++ 2013,Windows 7-64,Intel i7 3.6 GHz.我想测量非常快速的数学运算的执行时间,例如我希望将标准fabsf()函数的性能与替代的"更快"方法或标准tanh()与Pade近似等进行比较.
问题是这些操作太快了,即使我运行它们数十万次,我总是在基准测试的结束和开始之间获得0毫秒.
我试着用纳秒来获得时间,<chrono>但是它被四舍五入到十分之一毫秒,而不是真正的纳秒,所以在我的基准测试中我仍然得到0纳秒.
你能提供一些代码片段,我可以用它来运行我的基准测试吗?
这是我的:
#include <vector>
#include <chrono>
#include <ctime>
using namespace std;
// 1/RAND_MAX
#define RAND_MAX_RECIP 0.00003051757f
int _tmain(int argc, _TCHAR* argv[])
{
srand (static_cast <unsigned> (time(0)));
// Fill a buffer with random float numbers
vector<float> buffer;
for (unsigned long i=0; i<10000000; ++i)
buffer.push_back( (float)rand() * RAND_MAX_RECIP );
// Get start time
auto start = std::chrono::high_resolution_clock::now();
for (unsigned long i=0; i<buffer.size(); ++i)
{
// do something with …Run Code Online (Sandbox Code Playgroud) 它是在四核Cortex A9 ARMv7(Linux和gcc 4.8.2)上运行的实时音频应用程序,这是处理实际音频的部分(通过调用其他功能)并被发送到音频驱动程序:
struct STEREOOUT
{
std::vector<float> L;
std::vector<float> R;
};
STEREOOUT ProcessEngine(int e, unsigned int sf)
{
STEREOOUT out;
for (unsigned int s=0; s<sf; ++s)
{
float l, r;
engine[e]->Process(l, r);
out.L.push_back(l);
out.R.push_back(r);
}
return out;
}
// This is the main audio loop callback!
int AudioProcess(void *outputBuffer, unsigned int sampleFrames)
{
float *buffer = (float*)outputBuffer;
unsigned int s(0);
STEREOOUT e0 = async(launch::async, &ProcessEngine, 0, sampleFrames).get();
STEREOOUT e1 = async(launch::async, &ProcessEngine, 1, sampleFrames).get();
for (; s<sampleFrames; ++s)
{ …Run Code Online (Sandbox Code Playgroud) 在VS 2013中,我可以做到
void myFunction(vector<int> myVector)
{
// Do something with myVector
}
Run Code Online (Sandbox Code Playgroud)
我可以使用以下功能:
void anotherFunction()
{
myFunction({1, 25, 33, 45, 80});
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用Xcode 3.5(GCC 4.2)编译此代码,我会收到错误" '{'token'之前的预期主表达式 "以及" 对于调用anotherFunction(void)没有匹配函数 ".
是否有一个优雅的解决方法,我可以使用GCC 4.2了解我传递一个常量向量作为函数参数?
这之间是否有任何有价值的性能差异:
int myFunction(const int &a) { return 2 + a; }
Run Code Online (Sandbox Code Playgroud)
还有这个:
int myFunction(int a) { return 2 + a; }
Run Code Online (Sandbox Code Playgroud)
?
据我所知,第二种方法将变量的副本作为参数传递给新寄存器,这在asm代码中需要更多的指令.在这种情况下,这个函数被称为千次,性能至关重要,传递const引用而不是变量更好吗?
我有两个常量向量:
const vector<int> A = { 0, 12, 23, 34, 45, 56, 67, 78, 89 };
const vector<int> B = { 13, 24, 35, 46, 57, 68, 79 };
Run Code Online (Sandbox Code Playgroud)
我想像这样在他们之间切换
int main()
{
vector<int> myVector;
if ( something happens )
point myVector to A;
else
point myVector to B;
while ( a condition )
{
do something with ( myVector );
}
}
Run Code Online (Sandbox Code Playgroud)
我如何指向矢量A或B我应该如何声明myVector?
c++ ×8
vector ×3
function ×2
benchmarking ×1
c ×1
c++-chrono ×1
c++11 ×1
const ×1
cpu-usage ×1
fopen ×1
future ×1
gcc ×1
httprequest ×1
integer ×1
parsing ×1
performance ×1
pointers ×1
reference ×1
scaling ×1
sdcc ×1
simulation ×1
string ×1
struct ×1
xcode ×1