我正在开发一个我不太熟悉的基于Ada的项目,我刚刚看到的东西乍一看似乎效率低下,但当然这一切都取决于编译器可能会做什么.
if Ada.Strings.Fixed.Trim
(Source => Test_String,
Side => Ada.Strings.Both) =
String_1 then
--Do something here
elsif Ada.Strings.Fixed.Trim
(Source => Test_String,
Side => Ada.Strings.Both) =
String_2 then
--Do something else here
end if;
Run Code Online (Sandbox Code Playgroud)
我觉得调用Trim过程并将结果存储在String变量中更有效,然后在if语句的每个条件中测试不同的字符串,特别是如果有许多条件需要检查(更别提使用二进制文件)搜索可能会更好).当然,我可能是错的,所以我的问题是,Ada中的编译时间优化是否有一些我不知道的事情,这可能导致Trim函数只被调用一次,并且只在每个条件下测试结果if语句?
这将取决于编译器,而不依赖于语言.当然,GNAT GPL 2013会Trim在at -O2和at 两次调用两次-O3.
你(和我)的直觉似乎是正确的:做一次修剪并存储结果......
Trimmed : constant String :=
Ada.Strings.Fixed.Trim (Source => Test_String, Side => Ada.Strings.Both);
Run Code Online (Sandbox Code Playgroud)
......虽然我个人写的
Trimmed : constant String :=
Ada.Strings.Fixed.Trim (Test_String, Side => Ada.Strings.Both);
Run Code Online (Sandbox Code Playgroud)
理由是在这种情况下,没有人应该需要命名参数关联来澄清程序员的意图!
我不认为我们需要担心这种情况的效率.但是编码风格确实需要改进.在我看来,定义一个变量来保存Trim函数的结果是一种更好的做法.程序逻辑更清晰,更易于维护.
假设您想要将Trim函数更改为另一个或更改传入的参数,您只需要更改一个位置.虽然在这种情况下只有两个地方,但你仍然有机会出错.如果有更多的案例需要测试,那么肯定会遗漏案例.