Matlab:在最后一个句点字符处拆分字符串的最快方法

时间:2012-05-14 08:31:24

标签: string performance matlab

我必须在Matlab中编写程序,性能非常重要,因为它处理了大量文件。

我必须找到文件名的最后一个文件扩展名并将其拆分。

e.g。 file.name.tar.gz应该分为file.name.targz

我确定了3种方法,但我不知道哪种方法最快。

1

javaFilename = java.lang.String(fileName);
lastDot = javaFilename.lastIndexOf('.');
name = char(javaFilename.substring(0, lastDot-1));    
ext = char(javaFilename.substring(lastDot+1));

2

dots = findstr(fileName, '.');
lastDot = dots(length(dots));
name = fileName(1:lastDot-1);
ext = fileName(lastDot+1:end);    

3

[name tempExt] = strtok(fileName, '.');
while tempExt
    [temp2 tempExt] = strtok(fileName, '.');
    if tempExt
       name = strcat(name, '.', temp2);
    end
end
ext = temp2(2:end);

我认为第三个是最差的。但其他方法怎么样? 你能想出比我描述的方法更快的东西吗?

2 个答案:

答案 0 :(得分:2)

您可以通过执行以下操作来测试这些:

tic;
fileName = 'testFileName.ext';
for i=1:100000
  <find last dot>
end
toc;

我对你的基准测试,发现第二个更快。

我的解决方案是

for index=length(fileName):-1:1
  if (fileName(index) == '.')
    break;
  end
end

我得到的时间是:

Java解决方案:23秒

findstr解决方案:0.4秒

strtok解决方案:(没有终止;也许我把它复制错了)

反向for-loop解决方案:0.01秒

我的解决方案优于findstr和strtok的优点是: a)它只查找一个点,而不是所有点 b)它从字符串的结尾开始(可能大多数文件扩展名为2-4个字母)。

答案 1 :(得分:1)

内置命令fileparts可以满足您的需求,但可能不需要进行大量的开销/错误检查等。如果你看一下100左右的线,它就会

ind = find(name == '.', 1, 'last');

ext = name(ind:end);
name(ind:end) = [];

其中name是输入文件名。这非常类似于你的第二个建议 - 它可能会更快或更慢,我还没有完成时间。