C++ 中的快速百分位数

2023-12-21

我的程序计算风险价值指标的蒙特卡罗模拟。为了尽可能简化,我有:

1/ simulated daily cashflows
2/ to get a sample of a possible 1-year cashflow, 
   I need to draw 365 random daily cashflows and sum them

因此,每日现金流量是根据经验给出的分布函数,需要采样 365 次。为此,我

 1/ sort the daily cashflows into an array called *this->distro*
 2/ calculate 365 percentiles corresponding to random probabilities

我需要对年度现金流进行这种模拟,例如 10K 次,才能获得模拟年度现金流的总体数据。准备好每日现金流量的分配函数后,我进行抽样...

for ( unsigned int idxSim = 0; idxSim < _g.xSimulationCount; idxSim++ )
{
    generatedVal = 0.0;
    for ( register unsigned int idxDay = 0; idxDay < 365; idxDay ++ )
    {
        prob = (FLT_TYPE)fastrand();         // prob [0,1]
        dIdx = prob * dMaxDistroIndex;       // scale prob to distro function size
                                             // to get an index into distro array
        _floor = ((FLT_TYPE)(long)dIdx);     // fast version of floor
        _ceil  = _floor + 1.0f;              // 'fast' ceil:)
        iIdx1  = (unsigned int)( _floor );
        iIdx2  = iIdx1 + 1;

        // interpolation per se
        generatedVal += this->distro[iIdx1]*(_ceil - dIdx  );
        generatedVal += this->distro[iIdx2]*(dIdx  - _floor);
    }
    this->yearlyCashflows[idxSim] = generatedVal ;
}

两者里面的代码forCycles 进行线性插值。如果说 1000 美元对应 prob=0.01,10000 美元对应 prob=0.1,那么如果我没有 p=0.05 的经验数,我想通过插值得到 5000 美元。

问题是:这段代码运行正确,尽管探查器表示该程序将 cca 60% 的运行时间花在了插值本身上。所以我的问题是,如何才能更快地完成这项任务? VTune 报告的特定线路的示例运行时间如下:

prob = (FLT_TYPE)fastrand();         //  0.727s
dIdx = prob * dMaxDistroIndex;       //  1.435s
_floor = ((FLT_TYPE)(long)dIdx);     //  0.718s
_ceil  = _floor + 1.0f;              //    -

iIdx1  = (unsigned int)( _floor );   // 4.949s
iIdx2  = iIdx1 + 1;                  //    -

// interpolation per se
generatedVal += this->distro[iIdx1]*(_ceil - dIdx  );  //    -
generatedVal += this->distro[iIdx2]*(dIdx  - _floor);  // 12.704s

破折号表示探查器报告这些行没有运行时间。

任何提示将不胜感激。 丹尼尔

EDIT:c.fogelklou 和 MSalters 都指出了很大的改进。符合 c.fogelklou 所说的最佳代码是

converter = distroDimension / (FLT_TYPE)(RAND_MAX + 1)
for ( unsigned int idxSim = 0; idxSim < _g.xSimulationCount; idxSim++ )
{
    generatedVal = 0.0;
    for ( register unsigned int idxDay = 0; idxDay < 365; idxDay ++ )
    {
        dIdx  = (FLT_TYPE)fastrand() * converter;
        iIdx1 = (unsigned long)dIdx);
        _floor = (FLT_TYPE)iIdx1;
        generatedVal += this->distro[iIdx1] + this->diffs[iIdx1] *(dIdx  - _floor);
    }
}

我所拥有的最好的 MSalter 的路线是

normalizer = 1.0/(FLT_TYPE)(RAND_MAX + 1);
for ( unsigned int idxSim = 0; idxSim < _g.xSimulationCount; idxSim++ )
{
    generatedVal = 0.0;
    for ( register unsigned int idxDay = 0; idxDay < 365; idxDay ++ )
    {
        dIdx  = (FLT_TYPE)fastrand()* normalizer ;
        iIdx1 = fastrand() % _g.xDayCount;
        generatedVal += this->distro[iIdx1];
        generatedVal += this->diffs[iIdx1]*dIdx;
    }
}

第二个代码大约是。速度提高 30%。现在,在 95 秒的总运行时间中,最后一行消耗了 68 秒。最后一行仅消耗 3.2 秒,因此 double*double 乘法一定是魔鬼。我想到了 SSE - 将最后三个操作数保存到一个数组中,然后执行 this->diffs[i]*dIdx[i] 的向量乘法并将其添加到 this->distro[i] 但此代码运行了 50%慢点。因此,我想我碰壁了。

非常感谢大家。 D .


这是一项小型优化的提议,消除了对 ceil、两次强制转换和一次乘法的需要。如果您在定点处理器上运行,这可以解释为什么 float 和 int 之间的乘法和转换花费如此长的时间。在这种情况下,请尝试使用定点优化或在编译器中打开浮点(如果 CPU 支持)!

for ( unsigned int idxSim = 0; idxSim < _g.xSimulationCount; idxSim++ )
{
    generatedVal = 0.0;
    for ( register unsigned int idxDay = 0; idxDay < 365; idxDay ++ )
    {
        prob = (FLT_TYPE)fastrand();         // prob [0,1]
        dIdx = prob * dMaxDistroIndex;       // scale prob to distro function size
                                             // to get an index into distro array
        iIdx1  = (long)dIdx;
        _floor = (FLT_TYPE)iIdx1;     // fast version of floor
        iIdx2  = iIdx1 + 1;

        // interpolation per se
        {
           const FLT_TYPE diff = this->distro[iIdx2] - this->distro[iIdx1];
           const FLT_TYPE interp = this->distro[iIdx1] + diff * (dIdx - _floor);
           generatedVal += interp;
        }
    }
    this->yearlyCashflows[idxSim] = generatedVal ;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 中的快速百分位数 的相关文章

  • 如何在 DataColumn.Expression 中使用 IF/ELSE 或 CASE?

    我有一个包含 1 列的表 状态 我想添加另一列名为 Action 的列 其值如下 如果 Status Yes 则 Action Go 否则 Action Stop 我使用以下代码添加到 操作 列中 但它不起作用 myDataTable Co
  • 为什么在创建矩阵类时使用向量不好?

    对于我的矩阵类 我做了 template
  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • 平滑滚动.net 表单

    您好 我正在 net 中使用表单 并且在运行时动态添加大量链接标签 我将这些链接标签添加到面板并将该面板添加到 winform 当链接标签的数量增加时 表单会显示一个自动滚动条 垂直 现在 当我使用自动滚动向下滚动时 表单在滚动时不会更新其
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • GCC 和 ld 找不到导出的符号...但它们在那里

    我有一个 C 库和一个 C 应用程序 尝试使用从该库导出的函数和类 该库构建良好 应用程序可以编译 但无法链接 我得到的错误遵循以下形式 app source file cpp text 0x2fdb 对 lib namespace Get
  • 如何在 C# 控制台应用程序中将修饰符(ctrl、alt、shift)按键捕获为单个按键?

    Console ReadKey 仅在按下 正常 键时捕获输入 然后将修饰符 如果有 附加为键信息的一部分 如何将单个修饰键注册为输入 提供了一种解决方案这个链接 https blogs msdn microsoft com toub 200
  • 动态生成的控件 ID 返回为 NULL

    我可以在 Page PreInit 函数中创建动态控件 如何检索控件及其 ID 我的 C 代码用于创建动态控件之一 var btn new WebForms Button btn Text btn ID Addmore btn Click
  • C++ php 和静态库

    我创建了一个library a 其中包含 cpp 和 h 文件 其中包含很多类 嵌套类和方法 我想在 php 示例中包含这个静态库并尝试使用它 我想提一下 我是 php 新手 我已经在 test cpp 文件中测试了我的 libray a
  • 检查 RoutedEvent 是否有任何处理程序

    我有一个自定义 Button 类 当单击它时 打开特定窗口 它总是执行相同的操作 我添加了一个可以在按钮的 XAML 中分配的 Click 事件 就像常规按钮一样 当它被单击时 我想执行 Click 事件处理程序 如果已分配 否则我想执行默
  • 如何通过 JsonConvert.DeserializeObject 在动态 JSON 中使用 null 条件运算符

    我正在使用 Newtonsoft 反序列化已知的 JSON 对象并从中检索一些值 如果存在 关键在于对象结构可能会不断变化 因此我使用动态来遍历结构并检索值 由于对象结构不断变化 我使用 null 条件运算符来遍历 JSON 代码看起来像这
  • 是否有相当于 Clang/LLVM 的 .spec 文件,在哪里可以找到参考?

    The gcc驱动程序可以配置为使用特定的链接器 特定的选项和其他细节 例如覆盖系统头 specs files 当前 截至撰写本文时 GCC 版本 4 9 0 的手册此处描述了规范文件 https gcc gnu org onlinedoc
  • 在 EnvDTE 中调试时捕获 VS 局部变量

    是否可以使用 EnvDTE 进行 vsix Visual Studio 扩展来捕获本地和调试窗口使用的调试数据 或者可以通过其他方法吗 我想创建一个自定义的本地窗口 我们可以修改它以根据需要显示一些较重的内容 而无需为高级用户牺牲原始的本地
  • IEnumerable.Except 不起作用,那么我该怎么办?

    我有一个 linq to sql 数据库 非常简单 我们有 3 个表 项目和用户 有一个名为 User Projects 的连接表将它们连接在一起 我已经有了一个获得的工作方法IEnumberable
  • 更改 Windows Phone 系统托盘颜色

    有没有办法将 Windows Phone 上的系统托盘颜色从黑色更改为白色 我的应用程序有白色背景 所以我希望系统托盘也是白色的 您可以在页面 XAML 中执行此操作
  • C++ Streambuf 方法可以抛出异常吗?

    我正在尝试找到一种方法来获取读取或写入流的字符数 即使存在错误并且读 写结束时间较短 该方法也是可靠的 我正在做这样的事情 return stream rdbuf gt sputn buffer buffer size 但如果streamb
  • 矩阵到数组 C#

    这将是转换方阵的最有效方法 例如 1 2 3 4 5 6 7 8 9 into 1 2 3 4 5 6 7 8 9 in c 我在做 int array2D new int 1 2 3 4 5 6 7 8 9 int array1D new
  • iPhone 3GS 上的 ARM 与 Thumb 性能比较,非浮点代码

    我想知道是否有人有关于 iPhone 3GS 上 ARM 与 Thumb 代码性能的硬性数据 特别是对于非浮点 VFP 或 NEON 代码 我知道 Thumb 模式下的浮点性能问题 更大的 ARM 指令的额外代码大小是否会在某个时刻成为性能
  • ASP.NET Core MVC 视图组件搜索路径

    在此处的文档中 https learn microsoft com en us aspnet core mvc views view components view aspnetcore 2 2 https learn microsoft
  • 从 JavaScript 中的 OnClientClick 事件中阻止 C# 中的 asp:Button OnClick 事件?

    我有一个asp Button在我的网页上 它调用 JavaScript 函数和代码隐藏方法 后者进行调用以导航到另一个页面 在 JavaScript 函数中 我正在检查条件 如果不满足这个条件 我想中止导航 以便OnClick方法未被调用

随机推荐

  • 如何在 shell 脚本中切换到不同的用户并使用新用户执行某些命令?

    我当前使用用户 USER1 登录 SERVER1 并且我已将 bash 脚本放在这里 该脚本必须切换到同一服务器 SERVER1 上的不同用户 USER2 并使用新切换的用户执行一些命令 注意 USER1 不是 root 用户 因此我需要在
  • SQL:一个查询中有两个 select 语句

    我想从一个查询中的两个 SQL 表中选择信息 但这些信息是不相关的 因此不存在潜在的联合 以下设置就是一个示例 tbl马德里 id name games goals 1 ronaldo 100 100 2 benzema 50 25 3 b
  • 使用递归进行文件复制期间的powershell错误检查

    我有一个程序可以递归地复制文件夹和文件 例子 Copy Item path folderA destination folderB recurse 有时文件不会复制 有没有办法 步入递归 或更好的方法来做到这一点 这样我就可以在过程中而不是
  • Java:查找某个单词在字符串中出现的次数(是否有类似于 C# 的表达式)?

    我对查找一个单词在字符串中出现的次数很感兴趣 我看过SUN的例子匹配器演示 https stackoverflow com questions 3016522 count the number of times a string appea
  • c# 查找目录中包含列表/数组/数据表等中指定的值的所有文件名

    使用 c NET 4 6 1 我有一组字符串 我想用它们从给定目录中选择 有效 文件 这就是我的意思 下面是我想要用来从存储在数组中的目录获取预期文件名的字符串示例 我不关心这些值是否存储在数组 列表或其他类型的集合中 我可以将它们放入最适
  • 如何自定义斯巴达克斯中的较低级别组件?

    我正在尝试自定义ProductListItemComponent和ProductGridItemComponent为了添加更多功能 例如库存柜台 经过一些快速研究后 我得出的结论是 无法使用cmsComponents对象 只有实际的 CMS
  • 演示无法在 Windows 10 上运行

    我一直在尝试在装有 Windows 10 的本地计算机上运行 R3 Corda 提供的所有示例和演示 https docs corda net releases release V1 0 running the demos html htt
  • 从 Any 进行投射时 UIColor 子类崩溃?

    我知道 子类化UIColor不推荐 苹果说 大多数开发人员不需要子类化 UIColor 但是我愿意 有关原因的更多信息可以从另一个问题 https stackoverflow com questions 59739137 overridin
  • MySQL 查询耗时超过 6 秒

    不久前 我得到了一些有关特定查询的帮助 这是链接 SQL Group BY 在新列中使用字符串 https stackoverflow com questions 31012881 sql group by using strings in
  • Rails 中根据条件随机选择 n 个对象

    我有一个名为 Post 的模型 有一个名为 vote 的专栏 并且有大量帖子 我想随机选择 n 个拥有 gt x 票的帖子 与帖子数量相比 n 非常小 做这个的最好方式是什么 我尝试了几种似乎效率很低的方法 谢谢 如果您使用 MySQL 您
  • 通过java锁定oracle中登录的用户

    我有一个 jsp 和 servlet 中的 java web 应用程序和 db 作为 oracle 10g EE 在登录中 如果一个用户已登录 那么如何防止同一用户再次登录 除非注销 Note I am not告诉如果登录用户单击登录页面
  • 推荐用于与 Moxy 配合使用的 JAX-WS 框架

    目前我正在使用 CXF 但由于 CXF 中的以下代码 fall back if we re using another jaxb implementation try riContext JAXBUtils createRIContext
  • 光滑的左外连接获取整个连接行作为选项

    我的加入看起来像这样 def byIdWithImage for userId lt Parameters Long user image lt Users leftJoin RemoteImages on imageId id if us
  • Git Bash 插入波浪号

    有谁知道什么可能导致 git bash 在终端窗口中随机插入波浪号字符 另外我不确定是否相关 但是在 vim 中查看日志文件时 帮助对话框会自动在 vim 的拆分窗口中打开 有谁知道问题可能是什么 我怀疑这可能是某种保持活动的设置 但我还没
  • 服务层和模型与领域驱动设计的关联

    我正在设计 Web 应用程序的基础架构 该项目遵循领域驱动设计因为业务模型和逻辑非常复杂 该项目还旨在成为SOA项目 面向服务的架构 因此 我学习了很多有关服务以及如何围绕它构建项目的知识 继一个我之前的问题 https stackover
  • SCIP 代码如何处理 SAT 问题?

    我正在尝试了解 SCIP 如何处理 SAT 问题 在 SCIP 网站中 建议在读取 cnf 文件后在命令行中输入 setemergency cpsolver 来解决 SAT 问题 SCIP 求解器会在输入 optimize 后执行自己的操作
  • ubuntu eric 没有模块 PyQt5.Qsci

    昨天刚安装了Ubuntu 16 04 LTS 安装了Eric 工作得很好 今天想要启动 Eric 并使用 qtdesigner 但没有成功 出现错误 qtdesigner not found 因为您必须根据指南手动安装它 现在经历了这个错误
  • 我的 iOS 8 框架是否需要自己的代码签名才能分发?

    我正在尝试将我的 iOS 8 应用程序上传到应用程序商店进行分发 我的应用程序包含使用 Xcode 6 创建的框架 我从上传工具收到以下配置文件错误 错误 ITMS 90161 配置文件无效 com auraishere AuraClien
  • BadParcelableException:解组时出现ClassNotFoundException:android.support.v4.app.FragmentManagerState

    我3天前已经迁移到SDK Android 27 1 0 并且出现了一些像这样的崩溃 我不明白为什么 它 当前 出现在 Android 8 和 6 上 BadParcelableException ClassNotFoundException
  • C++ 中的快速百分位数

    我的程序计算风险价值指标的蒙特卡罗模拟 为了尽可能简化 我有 1 simulated daily cashflows 2 to get a sample of a possible 1 year cashflow I need to dra