标签: function-calls

过度使用函数调用会影响性能吗?特别是在Fortran

我习惯性地编写具有大量功能的代码,我觉得它更清晰.但是现在我在Fortran中编写了一些需要非常高效的代码,我想知道过度使用函数是否会降低它的速度,或者编译器是否会解决正在发生的事情并进行优化?

我知道在Java/Python等中,每个函数都是一个对象,因此创建大量函数需要在内存中创建它们.我也知道在Haskell中,函数相互减少,所以它没什么区别.

有没有人知道Fortran的情况?使用intent/pure函数/声明更少的局部变量/其他任何东西是否有区别?

optimization fortran function-calls

5
推荐指数
1
解决办法
2923
查看次数

将函数名称作为函数的参数传递

是否可以将函数的名称(比如A)作为参数传递给另一个函数(比如说B),然后从函数B中调用函数A.即函数名将存储在B中的变量中,并使用它调用名称在变量中的函数.例如,在C++排序函数中,第一个和第二个参数是迭代器,但第三个参数是函数的名称.

c++ parameter-passing function-calls

5
推荐指数
3
解决办法
9566
查看次数

c中全局变量的性能影响

我有5个函数被调用10000次(平均).所有这些都修改/使用某些变量.

我知道拥有全局变量是不好的做法.但是出于性能的考虑,将它们保持全局而不是传递它们是否有意义 - 特别是当我多次进行函数调用时?

或者我在性能方面不会获得太多收益?

c optimization performance global-variables function-calls

5
推荐指数
2
解决办法
2566
查看次数

“jal”到 MIPS 中另一个函数中间的原因可能是什么

我正在查看 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)

mips function-calls disassembly

5
推荐指数
1
解决办法
293
查看次数

Scala中的'Spread'参数?

有没有办法调用一个带有单个参数的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是否允许一个干净的语法来调用一个带有单个参数的函数,给定一组参数 - 而不是它是否是一个好的设计(尽管意见肯定是受欢迎的).

parameters dsl scala function-calls

5
推荐指数
1
解决办法
4159
查看次数

如何强制matlab在重载时调用常规函数而不是类方法?

假设我有一个X类的对象MyClass.MyClass有一个方法compute,当我调用时U = compute(X,...),matlab会自动调用类方法.但是,我真正想要的是调用另一个函数,该函数compute的参数以MyClass对象开头.如何强制matlab调用这个常规函数而不是进入类方法?

oop matlab function function-calls operator-precedence

5
推荐指数
1
解决办法
1147
查看次数

通过外部应用程序调用函数,而无需打开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(但在最坏的情况下)。

matlab lua cmd batch-file function-calls

5
推荐指数
1
解决办法
3028
查看次数

如何在X86-64架构的序言中减少rsp

我试图理解如何在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.

c assembly function-calls disassembly

5
推荐指数
1
解决办法
674
查看次数

C - printf的输出说明("%d%d \n",k = 1,k = 3);

如何解释下面代码的输出:

include <stdio.h>

int main(void) {
    int k;
    printf("%d %d\n",k=1,k=3);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Ideone Link

我的想法是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)

请让我知道我哪里错了?

c printf function-calls variable-assignment sequence-points

5
推荐指数
1
解决办法
159
查看次数

Lisp函数调用错误

我写了一个像这样的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)

lisp function-calls

4
推荐指数
2
解决办法
1334
查看次数