CustomScript

ページ

ラベル プログラム の投稿を表示しています。 すべての投稿を表示
ラベル プログラム の投稿を表示しています。 すべての投稿を表示

2020年4月5日日曜日

.NET Framework の ネイティブイメージコンパイル

  • .NET Framework
ひさびさの技術情報です。

「ネイティブ イメージを使って .NET デスクトップ アプリを最適化する」 というものがあったので試してみました。

これまで .NET Framework のネイティブコンパイラといえば NGEN がありました。 ネイティブコードにコンパイルしたものをシステムのキャッシュに登録し、実行時にそのキャッシュを使うことで高速化する仕組みです。 ですが、扱いづらい部分もあって、NGENツールでコンパイルしてシステムのキャッシュに登録するという処理が必要なためにインストール時に処理ができるMSIパッケージ等でしか実用できませんでした。 あと、フレームワークが更新されるとキャッシュが無効になるという問題もありました。

新しいネイティブイメージコンパイラはそのあたりの懸案が解消されます。 ビルド時にネイティブコンパイルも行い、実行ファイルの中にネイディブコードを埋め込みます。このため、ZIPパッケージやストアアプリでも恩恵を受けることができます。 欠点としては、アーキテクチャをx86,x64どちらかに限定してビルドしないといけないこと、ネイティブコードの分実行ファイルのサイズが大きくなること、でしょうか。

試してみた


試しにNeeViewをネイティブイメージコンパイラに対応させて検証してみました。起動からウィンドウ表示までの時間を複数回計測します。
# Default NeeView.exe size : 2,552KB App.MainWndow.Loaded.Done: 1735ms App.MainWndow.Loaded.Done: 1697ms App.MainWndow.Loaded.Done: 1728ms
# with Native Image Compiler NeeView.exe size : 5,420KB App.MainWndow.Loaded.Done: 1070ms App.MainWndow.Loaded.Done: 1028ms App.MainWndow.Loaded.Done: 1047ms
ファイルサイズは倍増しましたが、起動速度は3割ほど早くなりました。結構効いてますね。 数回起動してコンパイル済みキャッシュが効いている状態なので、初回起動時ならこの差はもっと大きくなると予想されます。

導入の注意点


「ネイティブ イメージを使って .NET デスクトップ アプリを最適化する」 を参照して導入すればいいのですが、いくつか注意点があります。
  • PowerShellでNugetインストールするとあるが、そのPowershellはパッケージマネージャーコンソールのことである(ツール > NuGetパッケージマネージャー > パッケージマネージャーコンソール)。通常のNugetパッケージのようにプロジェクトのNugetパッケージ管理からインストールしても良い。実行ファイルのプロジェクトだけで良い。
  • デフォルトのビルドログは省略されているので、オプションの「ビルド/実行」でビルド出力/ログを最小以上にする。これで "Native image ~ generated successfully" が確認できる。
  • VisualStudioから実行するとネイティブコンパイルされてないバイナリに置き換わってしまう?

2011年2月17日木曜日

チームでプログラムをつくるということ

google検索にひっかかるとウキーとなるHatenaですが、blogに良いことが載っていたためメモ。

http://d.hatena.ne.jp/jkondo/20110215/1297746368

自分が何をすべきか、今作っているものは何のために作っているのか、何がどうなると成功なのか、ということをしっかり分かった上で作らないと、バラバラの物ができあがりますし、モチベーションも沸きません。せっかく生産性高く、大量のプログラムコードを書いても使われないのでは意味がありません。

これよ。やはり先が見えてないとだめだよね。

2010年12月2日木曜日

rarをzipに変換 (ruby+unrar.exe+zip.exe)

圧縮形式を同じにしたほうがアイコンとかそろって気持ちいい。
ということでまずはrarをzipにすることを考えてみた。

rubyの勉強がてら変換スクリプトをgoogle先生に相談しつつ組んでみました。

環境



それぞれコマンドラインから使用できる状態にしておく

使用方法


$ ruby.exe rar2zip.rb [file.rar ...]

入力したrarファイルをzipに変換して出力します。
アーカイヴ名と内包するトップディレクトリ名が同じ場合、そのディレクトリ名を省略します。

rar2zip.rb

#!/bin/ruby -Ks
require 'tmpdir'

## error.
def failed(msg)
  puts "\nFailed!! -- #{msg}\n"
  abort
end

## system command.
def command(cmd)
  system cmd or failed "command failed.: #{cmd}"
end

## usage.
def usage
  print <<-EOS

rar2zip.rb ver 0.1
Usage: [ruby.exe] rar2zip.rb file.rar ...
  EOS
end

## main.
usage if ARGV.size==0
ARGV.each do |input|
  puts "#{input} ..."
  failed "file is not RAR." unless File.extname(input)=~/\.rar$/i
  output = File.expand_path(input).gsub(/\.\w+$/,".zip")
  failed "ZIP file already exists." if File.exist?(output)
  Dir.mktmpdir("temp-",".") do |temp|
    command "unrar x -inul \"#{input}\" #{temp}"
    dir = temp + "/" + File.basename(input,".*")
    dir = temp unless File.directory?(dir) && Dir.entries(temp).size==3
    Dir.chdir(dir) do
      command "zip -q -r \"#{output}\" *"
    end
  end
end
puts "Done."

所感


実装してて思ったのが、日本語ファイル名が意外と変換には厄介だということ。
文字化けしたり、途中でこけたりというアーカイバが結構あります。
大事なのは同じOSで、そのOS用にカスタムビルドしたツールを使うこと。
最初Cygwin上で実装しててはまりましたよ。ええ。