我正在使用此处记录的Google Cloud Vision Java API客户端:https://cloud.google.com/vision/docs/reference/libraries.
如果我通过将GOOGLE_APPLICATION_CREDENTIALS环境变量设置为引用右侧"服务帐户"的json文件来使用隐式默认凭据,则以下快速入门代码可以正常工作.
// Imports the Google Cloud client library
import com.google.cloud.vision.spi.v1.ImageAnnotatorClient;
import com.google.cloud.vision.v1.AnnotateImageRequest;
import com.google.cloud.vision.v1.AnnotateImageResponse;
import com.google.cloud.vision.v1.BatchAnnotateImagesResponse;
...
public class QuickstartSample {
public static void main(String... args) throws Exception {
// Instantiates a client
ImageAnnotatorClient vision = ImageAnnotatorClient.create();
...
BatchAnnotateImagesResponse response = vision.batchAnnotateImages(requests);
List<AnnotateImageResponse> responses = response.getResponsesList();
...
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我想使用简单的(单字符串)API密钥而不是服务帐户对API进行身份验证,我找不到解释如何通过此Java库执行此操作的文档.可能吗?
这是一个简短的Scala程序,它通过生成一组随机数来计算Euler数的差的近似值:
package example
import scala.util.Random
object ApproxE extends App {
def calc = {
var S = 0.0
for {i <- 1 to 100000000} {
var x = 0.0
var t = 0
while (x <= 1.0) {
x += Random.nextDouble
t += 1
}
S += t
}
S / 100000000
}
val st = System.currentTimeMillis()
val e = calc
val ed = System.currentTimeMillis()
println(e)
println(ed - st)
}
Run Code Online (Sandbox Code Playgroud)
在我的笔记本电脑上运行,它在大约7秒内完成计算.
以下是两个等效的Clojure函数.在48秒内返回,在230秒内返回.
在纯Clojure中,是否有可能编写一个性能与Java或Scala中可实现的性能相当的等效程序?
48S:
(defn calc []
(loop [i (int …Run Code Online (Sandbox Code Playgroud) 任何能回答这个问题的人都知道,JVM 支持多种字节码指令来调用方法(invokevirtual, invokespecial, invokestatic, ...)
对实例方法的大多数方法调用是由 进行的invokevirtual,但私有方法和初始化方法是通过 调用的invokespecial,如 JVM 规范中所述:
invokespecial和invokevirtual指令的区别在于invokevirtual根据对象的类调用方法。该invokespecial指令用于调用实例初始化方法以及当前类的超类的私有方法和方法。
据我了解,invokevirtual执行 vtable 查找来解析方法 while invokespecial,因为在链接时知道正确的方法实现,静态解析。
我的问题是,为什么在编译时已知方法所有者的具体类的情况下invokespecial不用于调用public方法?在我看来,出于效率原因,避免 vtable 查找是可取的。但很明显,我对 JVM 有一些不了解。