88862


`printf` 関数と `String.format` メソッドの出力の際の違いについて質問です。

以下のような小数点の数字を四捨五入して出力するプログラムを作っていますが、コードを書く際に使用した `printf()` と
`String.format()` の違いがはっきりとわからず、教えていただけたら幸いです。

**コード：**

[code]

    public class Main{
        public static void main (String[] args){
        System.out.println(String.format("%.1f", 56.734));
        System.out.printf("%.1f", 56.734);
        }
    }
    
[/code]

**実行結果：**

[code]

    String.format()→56.7
    printf()→56.7
    
[/code]

* * *

まず、現状の認識は以下の通りです。

  * 上記2つの関数とメソッドは、両方とも書式を指定してコンソールに結果を出力する
  * `String.format()` は `println` 関数なので出力する際に改行されて出力する
  * `printf()` は `println` ではないため出力される際に改行されずに出力する

そして、処理時間の計測の違いかと思い、`for` 文を使って1000回繰り返し出力させ実行時間の違いを計測しました。

すると `String.format()` の処理時間は **500189883ナノ秒** 、`printf` 関数の計測時間は
**274841755ナノ秒**
という結果でした。[私が以前にした質問](https://ja.stackoverflow.com/questions/88768/append%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%A8concat%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%AB%E3%82%88%E3%82%8B%E8%A8%88%E6%B8%AC%E6%99%82%E9%96%93%E3%81%AE%E9%81%95%E3%81%84)には、
**JVMやCPUも含めてベンチマークをしなければならない**
ということでしたので、もしかしたら多少の間違ったやり方をしているかもしれませんがご了承ください。

**処理時間を測ったコード：**

[code]

    public class Main{
        public static void main (String[] args){
        long start1 = System.nanoTime();
        for(int i1 = 0; i1<1000; i1++){
            System.out.println(String.format("%.1f", 56.734));
        }
        long end1 = System.nanoTime();
    
        long start2 = System.nanoTime();    
        for(int i2 = 0; i2<1000; i2++){
            System.out.printf("%.1f", 56.734);
        }
        long end2 = System.nanoTime();
           
        System.out.println("String.formatメソッドの計測時間は" + (end1 - start1) + "ナノ秒");
        System.out.println("printfメソッドの計測時間は" + (end2 - start2) + "ナノ秒");
    
        }
    }
    
[/code]

* * *

ですので、私が現在知っている以上の知識以外での `String.format()` と `printf()` の違いがあれば教えていただきたいです。やはり
**改行せずに** 書式を使用するか **改行して** 書式を使用するかの差が一番大きいでしょうか？


CC BY-SA 4.0
2022-05-16T14:13:37.600
88857
2022-05-17T09:22:20.103
2022-05-17T01:10:17.013
3060
51596
question
java
printf関数とString.formatメソッドの違い


`String.format()` に対しての誤解があるように見えます。`String.format()`
はあくまで書式を整形するのみで、出力する機能はありません。あなたが試したコードも `println`
を組み合わせた結果であり、改行の有無はコードの書き方次第です。

**質問中のコード:**

>
[code]

>     System.out.println(String.format("%.1f", 56.734));
>  
[/code]

* * *

`printf` は (恐らく) C 言語を由来として、非常に多くの言語で採用されている関数名です。

[printf - Wikipedia](https://ja.wikipedia.org/wiki/Printf)

> C言語から派生したC++やD言語はもとより、PHP、Ruby、Perlなど他の言語でもprintfが実装されている。

C 以外の言語での printf の説明には、大抵「C 言語と同じように～」と書かれています。

既に他の言語で printf を使ったことがあれば「どんな関数か」分かる利点はありますが、  
一方で "正しい英単語" では無いので直感的な名前ではありません。

ちなみに、C 言語等で書式設定しつつ出力せずにいったん変数に保存するには `sprintf` というもっと珍妙な関数名を使うことになります。

そういった意味で、C 言語より後に生まれたプログラミング言語では、より直感的な `format` という名前の関数 (メソッド名)
を別途用意しているのだと思います。

* * *

Java はあまり詳しく無いですが、PrintStream や PrintWriter クラスにも `format()`
メソッドがあり、こちらであれば出力も担っていそうです。

[Java書式付き出力](https://www.ne.jp/asahi/hishidama/home/tech/java/formatter.html)


CC BY-SA 4.0
2022-05-16T16:44:43.253
88862
2022-05-16T16:44:43.253
3060
88857
answer


だいたいご理解の通りで、ターミナルに出力させているのだろうと思いますが、コンソール出力をターミナルに垂れ流すときに改行を挟むとターミナルの方で改行・スクロールする時間が必要になるのでそれだけ遅延が発生します。リダイレクトしてファイルへ出力させたり/dev/nullへ流し込んだりすると速度が変わるはずです。お試しあれ。


CC BY-SA 4.0
2022-05-17T09:22:20.103
88877
2022-05-17T09:22:20.103
5734
88857
answer