如何告诉GCC展开特定的循环?我使用过CUDA SDK,可以使用手动展开循环#pragma unroll
.gcc有类似的功能吗?我用谷歌搜索了一下但找不到任何东西.
给出例如:
scala> def pipes(strings:String*) = strings.toList.mkString("|")
Run Code Online (Sandbox Code Playgroud)
我可以正常打电话:
scala> pipes("foo", "bar")
res1: String = foo|bar
Run Code Online (Sandbox Code Playgroud)
或者用splat:
scala> val args = List("a","b","c")
scala> pipes(args:_*)
res2: String = a|b|c
Run Code Online (Sandbox Code Playgroud)
但是我可以使用splat为除了varargs参数之外的任何东西提供参数吗?例如,我想做类似的事情:
scala> def pipeItAfterIncrementing(i:Int, s:String) = (i + 1) + "|" + s
scala> val args:Tuple2[Int, String] = (1, "two")
scala> pipeItAfterIncrementing(args:_*)
Run Code Online (Sandbox Code Playgroud)
这不起作用,但有没有办法实现从单个对象提供多个参数的相同效果,无论是元组还是其他东西?是否有任何理由不能为元组实现,因为它们的长度和类型在编译时都是已知的?
我有以下代码使用循环展开:
#pragma unroll
for (int i=0;i<n;i++)
{
....
}
Run Code Online (Sandbox Code Playgroud)
这里如果n是一个定义的常量,一切正常.但是,如果n是变量,则性能会大幅降低.我注意到发出并执行了大约3次指令.我想我正在寻找一种在运行时进行循环展开的方法,可能这是不可行的.
一个相对简单的问题,但答案似乎没有找到我.目前,我有一个类似于这样的数据框:
0 0 0 1 1
0 1 0 1 1
2 1 1 0 3
Run Code Online (Sandbox Code Playgroud)
我试图通过行将其转换为单行数据.我使用了这个unlist
功能,它完成了我想要的功能,但是按列给了我.它给了我这个:
0,0,2,0,1,1,0,0,1,1,1,0,1,1,3
Run Code Online (Sandbox Code Playgroud)
但我想要的是这个:
0,0,0,1,1,0,1,0,1,1,2,1,1,0,3
Run Code Online (Sandbox Code Playgroud)
如果这看起来像一个愚蠢的问题,我很抱歉,但我仍然是R的新手.任何帮助(或推荐可能帮助我处理这个问题的函数)都将非常感激.
假设我有一个如下所示的循环:
for(int i = 0; i < 10000; i++) {
/* Do something computationally expensive */
if (i < 200 && !(i%20)) {
/* Do something else */
}
}
Run Code Online (Sandbox Code Playgroud)
其中一些琐碎的任务卡在一个只运行少数几次的if语句后面.我总是听说"if-statements in loops很慢!" 因此,为了(略微)提高性能的希望,我将循环拆分为:
for(int i = 0; i < 200; i++) {
/* Do something computationally expensive */
if (!(i%20)) {
/* Do something else */
}
}
for(int i = 200; i < 10000; i++) {
/* Do something computationally expensive */
}
Run Code Online (Sandbox Code Playgroud)
gcc(带有适当的标志,如-O3)会自动将一个循环分成两个,还是仅展开以减少迭代次数?
由于使用PowerShell表达模式,PowerShell提供了一些不错的方法来反序列化对象,例如:
Invoke-Expression
小命令Invoke-Command
小命令&
我的一般期望是,给定表达式的结果应与在该表达式的相同序列化版本上使用上面列出的反序列化命令之一相同(有关背景,请参见“在PowerShell中保存哈希表”上的ConvertTo-Expression答案对象符号(PSON)问题)。
换一种说法:
<Expression> <=> Invoke-Command {<Expression>} <=> &([ScriptBlock]::Create('<Expression>'))
<Expression> <=> Invoke-Expression '<Expression>'
Run Code Online (Sandbox Code Playgroud)
例子:
Get-ChildItem <=> &{Get-ChildItem}
Get-ChildItem <=> Invoke-Command {Get-ChildItem}
Get-ChildItem <=> Invoke-Expression 'Get-ChildItem'
1, 2, 3 <=> &{1, 2, 3}
1, 2, 3 <=> Invoke-Command {1, 2, 3}
1, 2, 3 <=> Invoke-Expression '1, 2, 3'
Run Code Online (Sandbox Code Playgroud)
对于几乎每个表达式而言,确实确实存在这种情况,但是由于PowerShell默认情况下会展开(枚举)输出,因此在表达式包含具有单个项目的数组的情况下,此定义会有所不同:
,1 <?> Invoke-Command {,1}
,1 <?> Invoke-Expression ',1'
,"Test" <?> Invoke-Command {,"Test"}
,"Test" <?> Invoke-Expression …
Run Code Online (Sandbox Code Playgroud) 我有一个代码,我想将方法调用值放在方法的名称中。
@Unroll
def 'check #file other text'() {
setup:
def file = allProperties.keySet().getAt(0)
...
where:
...
Run Code Online (Sandbox Code Playgroud)
现在我创建了一个特殊的变量,目的只是为了命名方法。我可以做这样的事情:
static def allProperties
def setupSpec(){
allProperties== [1: 'asd', 2: 'ddd']
}
@Unroll
def 'check #allProperties.keySet().getAt(0) other text'() {
....
where:
...
Run Code Online (Sandbox Code Playgroud)
编辑:添加 setupSpec()
我理解展开循环的概念,但是有人可以向我解释如何展开一个简单的循环吗?
如果您能向我展示一个循环,然后是该循环的展开版本,并解释正在发生的事情,那就太好了。