我习惯性地编写具有大量功能的代码,我觉得它更清晰.但是现在我在Fortran中编写了一些需要非常高效的代码,我想知道过度使用函数是否会降低它的速度,或者编译器是否会解决正在发生的事情并进行优化?
我知道在Java/Python等中,每个函数都是一个对象,因此创建大量函数需要在内存中创建它们.我也知道在Haskell中,函数相互减少,所以它没什么区别.
有没有人知道Fortran的情况?使用intent/pure函数/声明更少的局部变量/其他任何东西是否有区别?
是否可以将函数的名称(比如A)作为参数传递给另一个函数(比如说B),然后从函数B中调用函数A.即函数名将存储在B中的变量中,并使用它调用名称在变量中的函数.例如,在C++排序函数中,第一个和第二个参数是迭代器,但第三个参数是函数的名称.
我有5个函数被调用10000次(平均).所有这些都修改/使用某些变量.
我知道拥有全局变量是不好的做法.但是出于性能的考虑,将它们保持全局而不是传递它们是否有意义 - 特别是当我多次进行函数调用时?
或者我在性能方面不会获得太多收益?
我正在查看 C 应用程序的一个非常可疑的反汇编 MIPS 代码
80019B90 jal loc_80032EB4
Run Code Online (Sandbox Code Playgroud)
loc_80032EB4 在另一个函数体的中间,我特别检查了在运行时没有在这个地址加载其他代码,并且以这种方式调用该函数(在开始时传递一些代码)可能很有用。但是在 C 中怎么做呢?它不是 goto,因为您不能转到另一个函数,并且正常的函数调用将始终“jal”到开头。这可以是一些手动优化吗?
更新:
两个函数的简化布局,被调用者:
sub_80032E88 (lz77_decode)
... save registers ...
80032E90 addiu $sp, -8
... allocate memory for decompressed data ...
80032EB0 move DECOMPRESSED_DATA_POINTER_A1, $v0
loc_80032EB4:
80032EB4 lw $t7, 0(PACKED_DATA_POINTER_A0)
... actual data decompression ...
80032F4C jr $ra
Run Code Online (Sandbox Code Playgroud)
呼叫者:
80019ACC addiu $sp, -0x30
... some not related code ...
80019B88 lw $a1, off_80018084 // A predefined buffer is used instead of allocating it for decompressed data
80019B90 jal loc_80032EB4 …Run Code Online (Sandbox Code Playgroud) 有没有办法调用一个带有单个参数的Scala函数,给定一个数组(类似于ECMAScript 6中的JavaScript Spreads)?
ys = [10.0, 2.72, -3.14]
f(x, ...ys);
Run Code Online (Sandbox Code Playgroud)
最干净的语法是:
f(1, ys)
Run Code Online (Sandbox Code Playgroud)
但这似乎不可能.甚至f(1, ys:_*)不起作用(也没有f(ys:_*),因为编译器报告的参数太少 - 只填充第一个参数).
例:
def f (a:Int, b:Float, c:Float, d:Float): String
val x = 1
val ys = List(10.0, 2.72, -3.14) // note: non-Objects
val result = f(x, ys) // intuitive, but doesn't work
Run Code Online (Sandbox Code Playgroud)
用例:将测试数据(来自集合)注入到接受单个参数的现有方法中.由于这些是测试用例,如果ys中的#params不匹配并且提供运行时错误或不正确的结果,那就很好了.
问题是Scala是否允许一个干净的语法来调用一个带有单个参数的函数,给定一组参数 - 而不是它是否是一个好的设计(尽管意见肯定是受欢迎的).
假设我有一个X类的对象MyClass.MyClass有一个方法compute,当我调用时U = compute(X,...),matlab会自动调用类方法.但是,我真正想要的是调用另一个函数,该函数compute的参数以MyClass对象开头.如何强制matlab调用这个常规函数而不是进入类方法?
有没有一种方法可以从外部调用Matlab函数,尤其是通过Windows cmd(还可以通过Linux终端,LUA脚本等)调用Matlab函数,而不必每次都打开Matlab的新实例?
例如cmd:
matlab -sd myCurrentDirectory -r "function(parameters)" -nodesktop -nosplash -nojvm
Run Code Online (Sandbox Code Playgroud)
相对较快地打开Matlab的新实例并执行我的功能。打开和关闭此简化的matlab提示大约需要2秒钟(无需计算),因此对于4000次执行而言,需要2个小时以上。我想避免这种情况,因为被调用的函数始终位于同一工作空间中。可以始终在同一实例中完成吗?
我已经进行了一些研究,找到了MATLAB COM Automation Server的可能性,但是对我来说似乎很复杂,并且我看不到使它适合我的情况的必要步骤。有什么建议吗?
我不熟悉,c/c++/c#但我正在考虑使用python(但在最坏的情况下)。
我试图理解如何在C中调用函数.当我反汇编这段代码(gcc -gdb;我在Linux上使用i5-3320M)来获取函数的序幕时toto:
void nop(){return ;}
void toto(int i, int j)
{
return;
}
int main(int argc, char **argv)
{
int i = 1;
int* pt;
i = 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到了序幕:
0x0000000000400523 <+0>: push %rbp
0x0000000000400524 <+1>: mov %rsp,%rbp
0x0000000000400527 <+4>: sub $0x8,%rsp
Run Code Online (Sandbox Code Playgroud)
在这里我不明白为什么rsp会减少8,因为我没有使用局部变量toto.而且,如果我使用局部变量:
void toto(int i, int j)
{
int i=1
return;
}
Run Code Online (Sandbox Code Playgroud)
我得到以下序言:
0x0000000000400523 <+0>: push %rbp
0x0000000000400524 <+1>: mov %rsp,%rbp
0x0000000000400527 <+4>: sub $0x18,%rsp
Run Code Online (Sandbox Code Playgroud)
在这里,我不明白为什么rsp减少0x18(24字节).我希望有16个字节的东西,因为我已经有了8的神秘偏移量,而且我需要4个字节用于int.但我的架构是64位,堆栈中的一个字不能少于8个字节,所以8 + 8 = 16.
如何解释下面代码的输出:
include <stdio.h>
int main(void) {
int k;
printf("%d %d\n",k=1,k=3);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的想法是1将分配给k变量然后1打印.同样3将分配给k和输出3.
预期产出
1 3
Run Code Online (Sandbox Code Playgroud)
实际产出
1 1
Run Code Online (Sandbox Code Playgroud)
我是从外推
int a;
if (a = 3) {
...
}
Run Code Online (Sandbox Code Playgroud)
等于
if (3) {
...
}
Run Code Online (Sandbox Code Playgroud)
请让我知道我哪里错了?
我写了一个像这样的Lisp函数:
(defun power (base exponent)
(if (= exponent 0)
1
(* base (power (- exponent 1)))))
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试调用它时,我会遇到一些错误:
CL-USER 2 > (power 2 3)
Error: POWER got 1 arg, wanted at least 2.
1 (abort) Return to level 0.
2 Return to top loop level 0.
Type :b for backtrace or :c <option number> to proceed.
Type :bug-form "<subject>" for a bug report template or :? for other options.
CL-USER 3 : 1 > (power 2)
Error: POWER got 1 arg, …Run Code Online (Sandbox Code Playgroud) function-calls ×10
c ×3
disassembly ×2
matlab ×2
optimization ×2
assembly ×1
batch-file ×1
c++ ×1
cmd ×1
dsl ×1
fortran ×1
function ×1
lisp ×1
lua ×1
mips ×1
oop ×1
parameters ×1
performance ×1
printf ×1
scala ×1