关于C#:为什么str2double在matlab中比mex函数那么慢?

Why is str2double so slow in matlab as compared to a mex-function?

我的问题是标题。

  • 与在C / C中制作的mex函数相比,为什么str2double在matlab中这么慢? Matlab是否不具有良好的字符串处理功能?

  • 任何人都可以给我一些事实原因,以了解为什么mex函数运行得快那么多个数量级?我希望对这种差异进行运行时分析,但我对matlab的代码没有任何具体原因。

  • 您能告诉我如何打开文件并实际查看为内置的matlab str2double函数编写的代码吗?

  • 有关以下主题的一些帖子:

    http://www.mathworks.com/matlabcentral/fileexchange/28893-fast-string-to-double-conversion

    当他们尝试解释此功能如何更快运行时,我不理解张贴者的含义。例如,这是什么意思:(str2doubleq是用c编写的mex函数)

    " str2doubleq利用mex网关使用c快速字符串处理功能和std :: stringstream属性。该转换使用与boost :: lexical_cast相同的思想。"

    没有人能回答这个问题吗?


    str2double的实现不会对您隐藏。要查看它,请键入edit str2doulbe.m。您还可以在代码上运行事件探查器,以查看函数在所有时间中所花费的时间。

    看一下函数,我猜是在循环内调用b / c sscanf很慢。您发布的fileexchange链接中的注释者之一建议使用以下代码来利用sscanf的矢量化功能:

    1
    d = reshape(sscanf(sprintf('%s#', c{:}), '%g#'), size(c));

    对于单元格数组,这实际上比str2double快得多。


    1)str2double是一个非常复杂的函数,可以转换许多不同的格式。我想您的mex实施要简单得多,这可以解释为什么它更快。 Matlab帮助中提供了Som示例:

    1
    2
    3
    4
    5
    6
       str2double('123.45e7')
       str2double('123 + 45i')
       str2double('3.14159')
       str2double('2.7i - 3.14')
       str2double({'2.71' '3.1415'})
       str2double('1,200.34')

    2)为什么混合速度更快?因为当您执行标准的m文件脚本时,基本上会有一个程序读取该程序并执行(解释器)。因此有两层。但是,在编写mex文件时,可以直接用CPU语言对其进行编译,以便可以由处理器直接运行它。只有一层,所以速度更快。有关更多详细信息,请参见维基百科文章:

    http://en.wikipedia.org/wiki/Interpreted_language

    http://en.wikipedia.org/wiki/Compiled_language

    3)您看不到str2double的代码,因为它已编译。 Matworks不提供此功能的代码。您可以执行它,但不能阅读它。所有内置函数都相同。