问题标签 [case-statement]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
delphi - 为什么 CharInSet 比 Case 语句快?
我很困惑。今天在 CodeRage,Marco Cantu 说 CharInSet 很慢,我应该尝试使用 Case 语句。我在我的解析器中这样做了,然后用 AQTime 检查了加速是什么。我发现 Case 语句要慢得多。
4,894,539 次处决:
而不是 CharInSet (P^, [' ', #10,#13, #0]) 做 inc(P);
时间为 0.25 秒。
但相同数量的执行:
而 True do
case P^ of
' ', #10, #13, #0: break;
其他公司(P);
结尾;
“while True”需要 0.16 秒,第一种情况需要 0.80 秒,else 情况需要 0.13 秒,总共需要 1.09 秒,或超过 4 倍。
CharInSet 语句的汇编代码是:
add edi,$02
mov edx,$0064b290
movzx eax,[edi]
call CharInSet
test a1,a1
jz $00649f18(回到add语句)
而案例逻辑就是这样:
movzx eax,[edi]
sub ax,$01
jb $00649ef0
sub ax,$09
jz $00649ef0
sub ax,$03
jz $00649ef0
add edi,$02
jmp $00649ed6(回到 movzx 语句)
在我看来,案例逻辑使用了非常高效的汇编程序,而 CharInSet 语句实际上必须调用 CharInSet 函数,该函数位于 SysUtils 中,也很简单,即:
函数 CharInSet(C: AnsiChar; const CharSet: TSysCharSet): 布尔值;
开始
Result := C in CharSet;
结尾;
我认为这样做的唯一原因是因为 [' ', #10, #13, #0] 中的 P^ 在 Delphi 2009 中不再允许,因此调用会转换类型以允许它。
尽管如此,我对此感到非常惊讶,但仍然不相信我的结果。
AQTime 测量是否有问题,我是否在比较中遗漏了什么,或者 CharInSet 真的是一个值得使用的高效函数?
结论:
我想你明白了,巴里。感谢您抽出宝贵时间做详细的示例。我在我的机器上测试了你的代码,得到了 0.171、0.066 和 0.052 秒(我猜我的台式机比你的笔记本电脑快一点)。
在 AQTime 中测试该代码,它给出了:三个测试的 0.79、1.57 和 1.46 秒。在那里,您可以看到仪器的大量开销。但真正让我吃惊的是,这种开销将明显的“最佳”结果更改为实际上是最差的 CharInSet 函数。
所以 Marcu 是正确的,而 CharInSet 更慢。但是您无意中(或者可能是故意)通过提取 CharInSet 对 Set 方法中的 AnsiChar(P^) 所做的事情,给了我一个更好的方法。除了与 case 方法相比速度稍有优势之外,它还比使用 case 方法更少的代码和更易于理解。
您还让我意识到使用 AQTime(和其他检测分析器)进行错误优化的可能性。知道这一点将有助于我对 Delphi 的 Profiler 和内存分析工具做出决定,这也是对我的问题AQTime 如何做到这一点的另一个答案?. 当然,AQTime 在检测时不会更改代码,因此它必须使用其他魔法来完成。
所以答案是 AQTime 显示的结果会导致错误的结论。
跟进:我留下了这个问题,“指责”AQTime 结果可能具有误导性。但公平地说,我应该指导您阅读这个问题:Delphi 是否有快速 GetToken 例程?它开始认为 AQTime 给出了误导性的结果,并得出结论认为它没有。
sql - SQL CASE 语句
在 SQL Server 2000 中是否可以执行以下操作?
谢谢。
c# - 在c#中运行时确定的切换值
我在 c# 中有一个 case 语句。我想在运行时从配置文件中选择案例的值。这可能吗?
sql - 为什么必须对 CASE 语句中的列进行 GROUP BY?
我试图在 SQL Server 2008 中针对某些数据输入不一致的表运行查询,我必须处理这个问题。
表数据示例:
我必须处理数量为负但 MarkedUpTotal 输入为正的情况。
我想运行以下查询:
但是,当我运行此查询时出现以下错误:
列 Qty 在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
MarkedUpTotal 列在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
我希望得到以下结果:
当 CASE 语句有条件地使用它们时,我必须 GROUP BY Qty 和 MarkedUpTotal 对我来说似乎很奇怪。如果我删除最后一个选择(CASE 语句),则查询执行良好,并且不需要 Qty 或 Price 在 GROUP BY 中。
为什么 SQL 需要这个?是否有一个查询可以完成上述操作?
目前我正在通过使用临时表来解决这个问题。如果需要,我会修改每个条目的 MarkedUpTotal,然后在临时表的主查询中执行简单的 SUM(MarkedUpTotal)。
sql-server - 带有 OR 的 where 子句中的 case 语句
提前道歉,因为我觉得我可能忘记/错过了一些明显的东西。开始; 我在 WHERE 子句中使用了 case 语句,以下工作正常:
我的“问题”是我想在我的 ELSE 块中添加一个额外的 OR 子句。就像这样:
自然,这会引发此错误:关键字“OR”附近的语法不正确。在 ELSE 语句中
因此我的问题......我可以用来完成这个的正确/替代逻辑是什么?
先感谢您
ruby-on-rails - If else 或 case 语句有帮助!
我真的可以使用一些帮助来完成以下任务:我的控制器中有以下内容(我知道这不应该在这里,需要移动到模型中)
这是一个电子邮件消息系统,因此根据您的职位,您可以通过电子邮件发送给一组人。因此,如果您是营长等,您可以选择向下面定义的 5 个组之一发送消息。如果您是连长,您的团队会发生变化。在视图中有一个下拉菜单,您可以选择您的消息发送到的组。选择菜单的填充取决于登录用户的位置。
问题似乎是“elsif”部分没有正确填充消息。它显示正确的下拉列表,并且就像发送了电子邮件但未填充电子邮件一样。然而,第一个值(营指挥官)工作正常。
我在 if else 语句中写错了什么吗?看起来应该很简单。用户位置总是正确反映,所以不是这样。
所以这不起作用,它适用于一组职位或另一组职位,但不能同时适用于两者。这与视图中的选择菜单相关,并且取决于您对某些人群的查询更改的位置。
所以在视图中我有这个:
我仍在学习rails,我不确定案例陈述是否会更好,但我对它的去向以及案例陈述如何融入视图感到困惑。
任何指导都会很棒,我正在努力解决这个问题并弄清楚,但我真的很感激一些帮助。
oracle - IF 中的多个 Select 语句
我可以使用一些帮助来编写报告的 prog./sql 构造..
Sql 应该首先检查提示,然后决定应该运行哪些“选择”语句
类似的东西(伪代码)
以上似乎不起作用。请帮忙!
sql - Progress DB SQL 的 LIKE 运算符
我正在尝试在 Progress SQL 中执行类似的操作(这不是 POSTGRES!)
但是 Progress 不支持 LIKE 运算符。INSTR
看起来它可能会完成这项工作,但它是一个 Progress 扩展,我正在使用的数据库不支持它。是否有另一种使用标准 ODBC 函数来实现这一点的方法?
谢谢
sql-server - SQL Case 语句能否通过?
有没有办法让 SQL 中的 CASE 语句像 C# 中的 case 语句一样失败?我不想做的是下面的例子,但如果这是我唯一的选择,我想我会去的。
例子:
编辑:
我正在使用 SQL Server。