java中final用在参数中表示啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中final用在参数中表示啥?相关的知识,希望对你有一定的参考价值。

public static HelloService getHelloServiceProxy(final HelloService helloService)其中的final用在参数中表示什么?

主要分两种情况:第一,用final修饰基本数据类型;第二,用final修饰引用类型。
第一种情况,修饰基本类型(非引用类型)。这时参数的值在方法体内是不能被修改的,即不能被重新赋值。否则编译就通不过。例如:
public static void valid(final int ag)

ag=9;
ag=10;

错误提示:
第二种情况,修饰引用类型。这时参数变量所引用的对象是不能被改变的。作为引用的拷贝,参数在方法体里面不能再引用新的对象。否则编译通不过。例如:
public static void valid(final String[] ag)

ag=new String[9];

这个的提示和上面是一样的。:“ The final local variable param2 cannot be assigned. It must be blank and not using a compound assignment.“
但是对于引用,如果我是这样,则不会报任何错,完全能编译通过。
public static void valid(final String[] ag)

ag[0]="5";
System.out.println(ag);

所以,final这个关键字,想用的话就用基本类型,还是很有作用的。引用类型,还是算了吧。
参考技术A final 修饰变量指变量的引用不可变,你给出的例子指的是helloService这个引用不可重新赋值。。本回答被提问者和网友采纳 参考技术B final修饰的如果是常量表示是不可变的
如果是变量,表示只能赋一次值,赋值后就不能在改变
参考技术C final 表示这个变量在初始化后不可更改及重新赋值 参考技术D final变量不可修改
final方法不可覆盖
final类不可继承

系统面板中的图表在 Wandb (PyTorch) 中表示啥

【中文标题】系统面板中的图表在 Wandb (PyTorch) 中表示啥【英文标题】:What do the charts in the System Panels signify in Wandb (PyTorch)系统面板中的图表在 Wandb (PyTorch) 中表示什么 【发布时间】:2021-05-07 09:38:51 【问题描述】:

我最近开始在我的 PyTorch 脚本中使用 wandb 模块,以确保 GPU 高效运行。但是,我不确定图表的具体含义。

我一直在关注这个链接中的教程,https://lambdalabs.com/blog/weights-and-bias-gpu-cpu-utilization/,被这个情节弄糊涂了:

我不确定 GPU % 和 GPU 内存访问 % 图表。博客中的描述如下:

GPU %:这张图可能是最重要的一张。它跟踪过去采样周期中一个或多个内核在 GPU 上执行的时间百分比。基本上,您希望这接近 100%,这意味着 GPU 一直忙于处理数据。上图有两条曲线。这是因为有两个 GPU,并且只有其中一个(蓝色)用于实验。 Blue GPU 大约 90% 忙,这意味着它还不错,但仍有一些改进的空间。这种次优利用的原因是由于我们在本实验中使用的小批量 (4)。 GPU 经常从其内存中获取少量数据,并且不会使内存总线或 CUDA 内核饱和。稍后我们将看到仅通过增加批量大小来增加这个数字是可能的。

GPU 内存访问百分比:这是一个有趣的问题。它测量过去采样期间读取或写入 GPU 内存的时间百分比。我们应该将这个百分比保持在较低水平,因为您希望 GPU 将大部分时间花在计算上,而不是从其内存中获取数据。在上图中,繁忙的 GPU 有大约 85% 的正常运行时间访问内存。这是非常高的,并导致了一些性能问题。在这里降低百分比的一种方法是增加批量大小,因此数据获取变得更加高效。

我有以下问题:

    上述值的总和不是 100%。看起来我们的 GPU 可以要么花时间在计算上,要么花时间在读/写内存上。这两个值之和怎么会大于100%? 为什么增加批量大小会减少访问 GPU 内存所花费的时间?

【问题讨论】:

2.当你得到一个大批量大小(例如 batch_size=1000,dataset_length=10000)时,GPU 必须在每个 epoch 重新分配内存 10 次。当您的批量大小为 10 时,它必须访问内存 1000 次。而 1000 次的分配时间比 10 次要长。 1. 我猜一个 gpu 可以同时分配和运行内核,但我不确定,这就是为什么我不会把这个作为答案和评论发布 关于问题 1:为什么您认为 GPU 利用率 % 和 GPU 内存访问 % 应该加起来为 100%? 【参考方案1】:

    如果硬件按顺序执行这两个过程,那么 GPU 利用率和 GPU 内存访问应该加起来 100% 是正确的。但是现代硬件不会做这样的操作。 GPU 将在访问内存的同时忙于计算数字。

    GPU% 实际上是 GPU 利用率百分比。我们希望这是 100%。因此,它将在 100% 的时间内完成所需的计算。 GPU 内存访问百分比是 GPU 读取或写入 GPU 内存的时间量。我们希望这个数字很低。如果 GPU 内存访问百分比很高,则在 GPU 可以使用数据进行计算之前可能会有一些延迟。这并不意味着它是一个连续的过程。

    W&B 允许您监控这两个指标并根据它们做出决策。最近我使用tf.data.Dataset 实现了一个数据管道。 GPU 利用率接近 0%,而内存访问也接近 0%。我正在阅读三个不同的图像文件并将它们堆叠起来。这里 CPU 是瓶颈。为了解决这个问题,我通过堆叠图像创建了一个数据集。 ETA 从每 epoch 1 小时缩短到 3 分钟。

从图中可以推断,GPU 的内存访问增加了,而 GPU 利用率接近 100%。 CPU 利用率下降,这是瓶颈。

    这是 Lukas 回答此问题的 nice article。

【讨论】:

以上是关于java中final用在参数中表示啥?的主要内容,如果未能解决你的问题,请参考以下文章

“InfoDictionary 版本”在信息属性列表(plist 文件)中表示啥?

“InfoDictionary 版本”在信息属性列表(plist 文件)中表示啥?

/dev/hda5在Linux中表示啥?

Java中final修饰参数的作用

java 参数final类型

将 java 方法参数设为 final