小编Chr*_*itt的帖子

在C++中最快的正弦,余弦和平方根的实现(不需要太精确)

我正在谷歌搜索过去一小时的问题,但只有泰勒系列或一些示例代码的要点太慢或根本不编译.好吧,我发现谷歌的答案大多是"Google it,它已经被问到了",但遗憾的是它不是 ......

我在低端Pentium 4上分析我的游戏,发现大约85%的执行时间浪费在计算窦,cosinus和平方根(来自Visual Studio中的标准C++库)上,这似乎与CPU密切相关(在我的I7上,相同的功能只有5%的执行时间,并且游戏更快了waaaaaaaaaa).我不能优化这三个函数,也不能在一次传递中计算正弦和余弦(相互依赖),但我不需要太精确的模拟结果,所以我可以使用更快的逼近.

那么,问题是:在C++中计算float的正弦,余弦和平方根的最快方法是什么?

编辑 查找表更加痛苦,因为在现代CPU上产生的Cache Miss比Taylor系列更昂贵.这些天CPU很快,而缓存则不然.

我犯了一个错误,我虽然需要为Taylor系列计算几个阶乘,我现在看到它们可以实现为常量.

所以更新的问题是:对于平方根还有任何快速优化吗?

EDIT2

我使用平方根计算距离,而不是规范化 - 不能使用快速反平方根算法(如评论中所指出:http://en.wikipedia.org/wiki/Fast_inverse_square_root

EDIT3

我也无法在平方距离上操作,我需要精确的距离进行计算

c++ math optimization trigonometry

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

私人成员的持续访问者之间的比较

这个问题的主要部分是关于为类内私有数据成员创建公共只读访问器的正确且计算效率最高的方法.具体来说,利用const type &引用来访问变量,例如:

class MyClassReference
{
private:
    int myPrivateInteger;

public:
    const int & myIntegerAccessor;

    // Assign myPrivateInteger to the constant accessor.
    MyClassReference() : myIntegerAccessor(myPrivateInteger) {}
};
Run Code Online (Sandbox Code Playgroud)

然而,目前建立的解决这个问题的方法是利用恒定的"getter"函数,如下所示:

class MyClassGetter
{
private:
    int myPrivateInteger;

public:
    int getMyInteger() const { return myPrivateInteger; }
};
Run Code Online (Sandbox Code Playgroud)

"getter/setters"的必要性(或缺乏)已经在诸如以下问题上反复出现:C++中访问方法(getter和setter)的约定然而这不是问题.

这两种方法都使用以下语法提供相同的功能:

MyClassGetter a;
MyClassReference b;    
int SomeValue = 5;

int A_i = a.getMyInteger(); // Allowed.    
a.getMyInteger() = SomeValue; // Not allowed.

int B_i = b.myIntegerAccessor; // Allowed.    
b.myIntegerAccessor = SomeValue; // Not allowed. …
Run Code Online (Sandbox Code Playgroud)

c++ optimization standards c++11

19
推荐指数
3
解决办法
1045
查看次数

Rails通过Javascript保护免遭伪造

我遇到了一个奇怪的CSRF,我试图访问我的rails服务器上传的javascript文件.我有一个控制器,如:

class SomeController < ApplicationController
  def show
    some_path = "/some/js/file/on/disk.js"
    send_file(some_path, type: "text/javascript", disposition: :inline)
  end
end
Run Code Online (Sandbox Code Playgroud)

但是当导航到http://localhost:3000/somes/1我时收到错误消息:

安全警告:另一个站点上的嵌入式标记请求受保护的JavaScript.如果您知道自己在做什么,请继续并禁用此操作的伪造保护,以允许跨源JavaScript嵌入.

提取的来源(第225行):

    if marked_for_same_origin_verification? && non_xhr_javascript_response?
      logger.warn CROSS_ORIGIN_JAVASCRIPT_WARNING if logger
      raise ActionController::InvalidCrossOriginRequest, CROSS_ORIGIN_JAVASCRIPT_WARNING
    end
  end
Run Code Online (Sandbox Code Playgroud)

请注意,我直接访问此页面,这意味着没有布局,所以我不能在我的布局中包含CSRF令牌.

是否需要采取不同的方式才能正确访问此资源?

编辑:根据评论请求,我在下面添加了完整跟踪.

actionpack(4.2.6)lib/action_controller/metal/request_forgery_protection.rb:225:在verify_same_origin_request' activesupport (4.2.6) lib/active_support/callbacks.rb:432:inmake_lambda 中的 块'activesupport(4.2.6)lib/active_support/callbacks.rb:239:block in halting' activesupport (4.2.6) lib/active_support/callbacks.rb:506:in 在调用块'activesupport(4.2.6)中lib/active_support/callbacks.rb:506:在each' activesupport (4.2.6) lib/active_support/callbacks.rb:506:in调用'activesupport(4.2.6)lib/active_support/callbacks.rb:92:in __run_callbacks__' activesupport (4.2.6) lib/active_support/callbacks.rb:778:in _run_process_action_callbacks'activesupport(4.2.6)lib/active_support/callbacks.rb:81:in run_callbacks' actionpack (4.2.6) lib/abstract_controller/callbacks.rb:19:inprocess_action 'actionpack(4.2.6)lib/action_controller/metal/rescue.rb:29:在process_action' actionpack (4.2.6) lib/action_controller/metal/instrumentation.rb:32:inprocess_action 中的 块'activesupport(4.2.6)lib/active_support/notifications.rb:164:在block in instrument' activesupport …

javascript ruby-on-rails csrf ruby-on-rails-4

13
推荐指数
1
解决办法
817
查看次数

g ++优化打破了循环

几天前,我遇到了我认为是g ++ 5.3中有关在更高-OX优化级别嵌套for循环的错误.(专门为它-O2而经历过-O3).问题是,如果你有两个嵌套的for循环,它有一些内部和来跟踪总迭代次数,一旦这个总和超过它的最大值,就会阻止外部循环终止.我能够复制的最小代码集是:

int main(){
    int sum = 0;
    //                 Value of 100 million. (2047483648 less than int32 max.)
    int maxInner = 100000000;

    int maxOuter = 30;

    // 100million * 30 = 3 billion. (Larger than int32 max)

    for(int i = 0; i < maxOuter; ++i)
    {
        for(int j = 0; j < maxInner; ++j)
        {
            ++sum;
        }
        std::cout<<"i = "<<i<<" sum = "<<sum<<std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

当使用g++ -o run.me main.cpp它编译时,它按预期输出运行:

i = …
Run Code Online (Sandbox Code Playgroud)

c++ optimization for-loop nested-loops

8
推荐指数
3
解决办法
1049
查看次数

索引中的权威授权

我最近一直在阅读pundit gem的自述文件,并注意到他们从未在控制器中授权索引视图.(相反,他们使用范围).

他们给出了很好的推理,因为索引页面通常包含元素列表,通过控制生成的列表,您可以有效地控制页面上的数据.但是,偶尔也可能希望阻止访问索引页面本身.(而不是允许访问空白索引页.)我的问题是,执行此操作的正确方法是什么?

到目前为止,我已经提出了几种可能性,并且有以下几个类:

  • 一个模型 MyModel
  • 一个控制器 MyModelsController
  • 一项政策 MyModelPolicy

在我的控制器的索引方法中,解决此问题的推荐方法如下:

def index
  @my_models = policy_Scope(MyModel)
end
Run Code Online (Sandbox Code Playgroud)

然后,这将允许访问索引页面,但会将结果过滤到该用户可以看到的内容.(EG没有结果无法访问.)

但是为了阻止对索引页面本身的访问,我得到了两种不同的可能性:

def index
  @my_models = policy_Scope(MyModel)
  authorize @my_models
end
Run Code Online (Sandbox Code Playgroud)

要么

def index
  @my_models = policy_Scope(MyModel)
  authorize MyModel
end
Run Code Online (Sandbox Code Playgroud)

哪一个是正确的路径,还是有一个不同的替代选择?

ruby-on-rails pundit

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