- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在编写一个图形引擎作为大学作业,最近试图优化我的部分代码,但优化似乎反而减慢了它的速度。
代码的这个特定部分处理 2D Lindenmayer 系统并将它们转换为“line2D”对象的列表,这些对象可以由程序的另一部分处理成图像。
这样做时,它使用 sin 和 cos 来计算下一个点的坐标,并且由于 sin 和 cos 是浮点运算,我认为这些操作会很耗时,尤其是在更复杂的 lindenmayer 系统中。所以我创建了一个对象类“cossinlist”,它从 .txt 文件中为 0 到 359 度之间的每个整数角度(转换为 rad)导入 cos 和 sin 的值到两个名为“coslist”和“sinlist”的 map ,角度为作为关键。这样,在处理包含小数部分的角度时,我只需要做实际的失败。
然后我决定在一个相对密集的系统上测量优化和不优化(通过注释掉)的执行时间:引擎在 33.4016 秒内生成图像,而没有它只用了 25.3686 秒。这是一个实质性的差异,但不是以预期的方式。我做了更多的测试,所有测试都给出了相似比例的差异,所以现在我想知道......是什么导致了这种差异?
函数:
img::EasyImage LSystem2D(const unsigned int size, const ini::DoubleTuple & backgroundcolor, LParser::LSystem2D & System, const ini::DoubleTuple & color)
{
CosSinList cossinlist;
std::string string;
Lines2D Lines;
double origin = 0;
Point2D currentpos(origin, origin);
Point2D newpos(origin, origin);
std::stack<Point2D> savedpositions;
double currentangle = System.get_starting_angle();
std::stack<double> savedangles;
const img::Color linecolor(color.at(0)*255,color.at(1)*255,color.at(2)*255);
const img::Color BGcolor(backgroundcolor.at(0)*255,backgroundcolor.at(1)*255,backgroundcolor.at(2)*255);
string = ReplaceLsystem(System, (System.get_initiator()), (System.get_nr_iterations()));
bool optimizedangle = false;
if(System.get_angle() == rint(System.get_angle()) && (System.get_starting_angle() == rint(System.get_starting_angle()))
{
optimizedangle = true;
}
for(char& c : string)
{
if(currentangle > 359){currentangle -= 360;}
if(currentangle < -359){currentangle += 360;}
if(System.get_alphabet().count(c) != 0)
{
/*if(optimizedangle == true)
{
if(currentangle >= 0)
{
newpos.X = currentpos.X+(cossinlist.coslist[currentangle]);
newpos.Y = currentpos.Y+(cossinlist.sinlist[currentangle]);
}
else
{
newpos.X = currentpos.X+(cossinlist.coslist[360+currentangle]);
newpos.Y = currentpos.Y+(cossinlist.sinlist[360+currentangle]);
}
}
else
{*/
newpos.X = currentpos.X+cos(currentangle*PI/180);
newpos.Y = currentpos.Y+sin(currentangle*PI/180);
//}
if(System.draw(c))
{
Lines.push_back(Line2D(currentpos,newpos,linecolor));
currentpos = newpos;
}
else
{
currentpos = newpos;
}
}
else if(c=='-')
{
currentangle -= System.get_angle();
}
else if(c=='+')
{
currentangle += System.get_angle();
}
else if(c=='[')
{
savedpositions.push(currentpos);
savedangles.push(currentangle);
}
else if(c==']')
{
currentpos = savedpositions.top();
savedpositions.pop();
currentangle = savedangles.top();
savedangles.pop();
}
}
return Drawlines2D(Lines, size, BGcolor);
}
SinCosList 类:
#include <fstream>
#include <iostream>
#include <map>
#include "CosSinList.h"
using namespace std;
CosSinList::CosSinList()
{
string line;
std::fstream cosstream("coslist.txt", std::ios_base::in);
double a;
double i = 0;
while (cosstream >> a)
{
coslist[i] = a;
i += 1;
}
std::fstream sinstream("sinlist.txt", std::ios_base::in);
i = 0;
while (sinstream >> a)
{
sinlist[i] = a;
i += 1;
}
};
CosSinList::~CosSinList(){};
“优化”以我在速度测试期间注释掉的相同方式被注释掉,只有对象的实际使用被注释掉(SinCosList 仍在初始化和检查是否可以使用的 bool 值也还在初始化中)
最佳答案
(我假设 coslist
和 sinlist
是普通数组或类似数组)
一些事情:
关闭优化后,您测量的是无关紧要的东西。未优化代码的性能与启用优化后的性能相关性很差。
optimzedangle
应该是编译时常量。 如果优化器知道 optimizedangle
在该程序的整个运行过程中不会改变,则它可能能够简化代码。有了这个特定的代码片段,它可能可以弄清楚,但如果你不需要,你不应该依赖它,而且通常很容易不小心在你认为很明显的地方写了代码一个变量保持不变,但编译器比你更聪明,它意识到你已经打开了一个漏洞,可能允许变量发生变化,因此它必须编写更慢的循环来解决这个问题。
内部循环中的分支——尤其是不可预测的分支——会降低性能。尝试编写你的循环,这样就没有任何分支;例如确保 currentangle
始终为正值,或者使查找表 720
条目较长,以便您始终可以只索引 360 + currentangle
。
我倾向于避免这些,因此我从来不擅长预测什么时候它真的是一个问题,但这可能才是真正要了你的命。
您没有发布您的数据结构,但我想象大约 6k 字节。这是您的 L1 缓存的一个重要百分比。这是否是此循环中的重要影响对我来说并不明显。
关于c++ - 为什么这个 "optimization"会减慢我的程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29048556/
我正在尝试运行以下代码片段,以使曲线适合一些经验数据,但在Julia Optim.jl包中,optimize()方法一直存在问题。我正在使用Julia v1.1.0,并安装了所有正确的软件包。我不断收
时不时你会听到一些故事,这些故事旨在说明某人在某件事上有多擅长,有时你会听到这个人如何热衷于代码优化,以至于他优化了他的延迟循环。 因为这听起来确实是一件奇怪的事情,因为启动“计时器中断”而不是优化的
我正在尝试使用 z3py 作为优化求解器来最大化从一张纸上切出的长方体的体积。 python API 提供了 Optimize() 对象,但使用它似乎不可靠,给我的解决方案显然不准确。 我尝试使用 h
我今天接受了采访。这个问题是为了优化下面的代码。如果我们将在 for 循环之后看到下面的代码,那么下面有四个“if-else”步骤。所以,面试官要求我将其优化为 3 if-else 行。我已经尝试了很
我使用BFGS算法使用Optim.jl库来最小化Julia中的函数。今天,我问了一个关于同一个库的question,但是为了避免混淆,我决定将它分成两部分。 我还想对优化后的负逆黑森州进行估算,以进行
在 haskell 平台中实现许多功能时有一个非常常见的模式让我很困扰,但我找不到解释。这是关于使用嵌套函数进行优化。 where 子句中的嵌套函数旨在进行尾递归的原因对我来说非常清楚(如 lengt
我目前正试图利用 Julia 中的 Optim 包来最小化成本函数。成本函数是 L2 正则化逻辑回归的成本函数。其构造如下; using Optim function regularised_cost
我正在使用 GEKKO 来解决非线性规划问题。我的目标是将 GEKKO 性能与替代方案进行比较,因此我想确保我从 GEKKO 中获得其所能提供的最佳性能。 有n个二元变量,每个变量都分配有一个权
我可以手动更改参数C和epsilon以获得优化结果,但我发现有PSO(或任何其他优化算法)对SVM进行参数优化。没有算法。什么意思:PSO如何自动优化SVM参数?我读了几篇关于这个主题的论文,但我仍然
我正在使用 scipy.optimize.fmin_l_bfgs_b 来解决高斯混合问题。混合分布的均值通过回归建模,其权重必须使用 EM 算法进行优化。 sigma_sp_new, func_val
当你有一个 Option ,编译器知道 NULL永远不是 &T 的可能值, 和 encodes the None variant as NULL instead .这样可以节省空间: use std:
当你有一个 Option ,编译器知道 NULL永远不是 &T 的可能值, 和 encodes the None variant as NULL instead .这样可以节省空间: use std:
以下是说明我的问题的独立示例。 using Optim χI = 3 ψI = 0.5 ϕI(z) = z^-ψI λ = 1.0532733 V0 = 0.8522423425 zE = 0.598
根据MySQL文档关于Optimizing Queries With Explain : * ALL: A full table scan is done for each combination o
我无法预览我的 Google 优化工具体验。 Google 优化抛出以下错误: 最佳答案 我也经常遇到这种情况。 Google 给出的建议是错误的。清除 cookie 并重新启动浏览器并不能解决问题。
我一直在尝试使用 optim()或 optimize()函数来最小化绝对预测误差的总和。 我有 2 个向量,每个长度为 28,1 个包含预测数据,另一个包含过去 28 天的实际数据。 fcst和 ac
在我对各种编译器书籍和网站的独立研究中,我了解到编译器可以优化正在编译的代码的许多不同方法,但我很难弄清楚每种优化会带来多少好处给予。 大多数编译器编写者如何决定首先实现哪些优化?或者哪些优化值得付出
我在我的项目中使用 System.Web.Optimizations BundleConfig。我在我的网站上使用的特定 jQuery 插件遇到了问题。如果我将文件添加到我的 ScriptBundle
我收到这个错误 Error: webpack.optimize.CommonsChunkPlugin has been removed, please use config.optimization.
scipy的optimize.fmin和optimize.leastsq有什么区别?它们似乎在 this example page 中以几乎相同的方式使用.我能看到的唯一区别是 leastsq 实际上
我是一名优秀的程序员,十分优秀!