String Matlab:在最后一个字符段拆分字符串的最快方法

String Matlab:在最后一个字符段拆分字符串的最快方法,string,performance,matlab,String,Performance,Matlab,我必须用Matlab编写一个程序,性能非常重要,因为它处理了很多文件 我必须找到文件名的最后一个文件扩展名并将其拆分 e、 g.file.name.tar.gz应分为file.name.tar和gz 我确定了3种方法来实现这一点,但我不知道哪种方法最快 一, 二, 三, 我认为第三个是最糟糕的。但是其他的方法呢? 你能想出比我描述的方法更快的方法吗 您可以通过执行以下操作来测试: tic; fileName = 'testFileName.ext'; for i=1:100000 <f

我必须用Matlab编写一个程序,性能非常重要,因为它处理了很多文件

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

e、 g.
file.name.tar.gz
应分为
file.name.tar
gz

我确定了3种方法来实现这一点,但我不知道哪种方法最快

一,

二,

三,

我认为第三个是最糟糕的。但是其他的方法呢?
你能想出比我描述的方法更快的方法吗

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

tic;
fileName = 'testFileName.ext';
for i=1:100000
  <find last dot>
end
toc;
我得到的时间是:

Java解决方案:23秒

findstr解决方案:0.4秒

strtok解决方案:(没有终止;可能是我复制错了)

反向循环解决方案:0.01秒

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

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

tic;
fileName = 'testFileName.ext';
for i=1:100000
  <find last dot>
end
toc;
我得到的时间是:

Java解决方案:23秒

findstr解决方案:0.4秒

strtok解决方案:(没有终止;可能是我复制错了)

反向循环解决方案:0.01秒

与findstr和strtok相比,我的解决方案的优势在于: a) 它只查找一个点,而不是所有点
b) 它从字符串的末尾开始(大概大多数文件扩展名都是2-4个字母长)。

内置命令
fileparts
可以满足您的需要,但可能需要大量开销/错误检查等,这可能不是必需的。如果你看100左右的线,是的

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

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

其中,
name
是输入文件名。这与您的第二个建议非常相似-可能会快一点或慢一点,我还没有完成计时。

内置命令
fileparts
可以满足您的需要,但可能需要大量开销/错误检查等,这可能不是必需的。如果你看100左右的线,是的

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

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

其中,
name
是输入文件名。这与你的第二个建议非常相似——可能快一点,也可能慢一点,我没有计时。

而不是
lastDot=dots(length(dots))您可以使用
lastDot=dots(结束)您有数百个文件名要处理,所以即使是这些解决方案中速度最慢的也需要什么?比最快的方法多处理一毫秒?在我看来,这似乎是一个愚蠢的优化。正如您在Richantes的答案中所看到的,最慢的方法所花费的时间大约是最快的方法的2300倍,因此它是有意义的您可以使用
lastDot=dots(结束)您有数百个文件名要处理,所以即使是这些解决方案中速度最慢的也需要什么?比最快的方法多处理一毫秒?对我来说,这似乎是一个愚蠢的优化。正如你在Richantes的回答中所看到的,最慢的方法需要的时间是最快的方法的2300倍,因此它是有意义的。感谢基准测试技术,我不知道tic和toc。此外,您的解决方案是最快的。在strtok解决方案中,我有一个错误。在第3行中,它应该是
[temp2 tempExt]=strtok(tempExt,'.')。感谢您的基准测试技术,我不知道tic和toc。此外,您的解决方案是最快的。在strtok解决方案中,我有一个错误。在第3行中,它应该是
[temp2 tempExt]=strtok(tempExt,'.')
for index=length(fileName):-1:1
  if (fileName(index) == '.')
    break;
  end
end
ind = find(name == '.', 1, 'last');

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